perm filename ERRATA.TXT[TEX,DEK] blob
sn#671810 filedate 1982-08-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 This is a list of all errors in the September 1978 TEX user manual that
C00009 00003 Extensions to TEX made since the November printing of the manual:
C00014 00004 Corrections noted since the November 1978 printing:
C00019 00005 Important changes made to TEX on February 25, 1979:
C00023 00006 New extensions to TEX subsequent to the April printing of the manual.
C00027 00007 Changes made subsequent to the Digital Press edition of the manual (Dec 1979)
C00036 00008 TEX 80: the last extensions to TEX before 1990
C00052 00009 Changes since October 1, 1980 (when a hardcopy version of this ERRATA file
C00080 00010 This page describes differences between TEX82, which is the portable
C00131 00011 This page contains updates to the differences between TeX82 and TeX80.
C00193 00012 IMPORTANT NOTE ABOUT A CHANGE TO BASIC.TEX
C00196 ENDMK
C⊗;
This is a list of all errors in the September 1978 TEX user manual that
were known on November 4, 1978. It also includes a few things that were
omitted in September. All these changes (and only these) have been
incorporated into the November 1978 manual.
Title page, change date to "November 1978 (second printing)" and change
"draft" to "drafts" in the first line of the footnote.
Page 26, line 4, delete "of the second paragraph".
Page 29, line 13, change "later.)" to "later. A list of control sequences for
special symbols appears in Appendix F.)
Page 40, line 15
(one centimeter equals 26.600 Didot points)
Page 32, line 18, change "12" to "11".
Page 59, line 4, insert a ")" after this line.
Page 61, line 28, insert a "$" before the pound sterling sign
Page 61, line 30, change ", and" to ", ``$\$$'', and"
Page 82, line 13, append this to the paragraph: "Another case is a formula
like n/log n, where a negative thin space has been inserted after the /.)".
Page 102, line 6, append this to the paragraph: "The control sequences
\vcenter and \vtop are also useful for box positioning (see Chapter 26)."
Page 106, line 17, change "instead of ``$\ctr{#}$''" to "instead
of ``\ctr{$#$}''".
Page 106, last three lines, change "processed; you might ... appropriate \def."
to "processed.".
Page 135, change the first 7 lines to the following:
based only on the current style, regardless of the sizes of numerator and
denominator.
/ \vcenter \
*< >{<vlist>} Append a centered or top-adjusted box.
\ \vtop /
The specified vertical list is constructed in restricted vertical mode, then
it is \vjusted and the resulting box is moved up or down so that (\vcenter)
it is centered vertically just as large delimiters are, or (\vtop) the
baseline of the topmost box in the vertical list coincides with the baseline
of the formula. Then TEX resumes its activities in math mode.
Page 158, line 16, change ". (We" to ".\xskip (We".
Page 158, new paragraph inserted before the 4th-last line on this page:
* Within a paragraph, type ``\xskip'' before and after parenthesized
sentences. (For example, there is an \xskip in the paragraph you are now
reading, and in algstep E1 above.)
(The convention just explained has also been introduced into the entire TEX
manual.)
Page 159, replace last two paragraphs by one paragraph, to wit:
If the exercise contains a ``hint'' within a paragraph, you type
``\xskip[{\sl Hint:} ''; as usual, there should be no space before \xskip.
Page 162, line 4, change "Addison-Wesley's" to "the publisher's".
Page 165, line 15, change "4.5" to "4.625".
Page 165, line 23, change "4" to "4.25".
Page 182, line 6, change "or XYZages" to "XYZages, or XYZest"
Page 182, lines 14 and 15, change "-xe, or -xye, where x and y" to
"-Xe, or -XYe, where X and Y"
Page 182, line 18, new sentence appended to this paragraph:
"Similarly, final syllables of the form -Xed or -XYed (except -ized)
are also disregarded."
Page 185, line 22, delete "guess-work"
Page 186, line 7, change "prob-a-bil-ity" to "prob-abil-ity".
Page 187, index entry for Bibliographic..., change "14" to "15".
Page 189, index entry for \deg, add page 164.
Page 195, delete 15th line in left-hand column.
Page 195, index entry for \spose, add page 39.
Page 196, index entry for \vcenter, add page 102.
Page 196, new index entry:
\vtop (make <vlist> box using top baseline), 102, 135.
Page 196, index entry for \xskip, change "159" to "158--160".
Page 196, index entries for \yskip and \yyskip, change "158--159" and "158"
to "159".
Page 197, index entry for \$, add page 61.
Page 198, the TEX logo is too small, each time it appears on this page.
Extensions to TEX made since the November printing of the manual:
1. Several new <dimenparam>s have joined \hsize, \vsize, \topbaseline, etc.,
namely \lineskiplimit, \mathsurround, and \varunit.
By typing "\lineskiplimit <dimen>" you specify a dimension p such that
\lineskip glue is used as the interline glue if and only if x-h-d < p, in
the notation of Chapter 15.
By typing "\mathsurround <dimen>" you specify an amount
of blank space to be inserted at the left and right of any formula
embedded in text (i.e., formulas delimited by $ and $).
By typing "\varunit <dimen>" you specify the current value of a
variable-size unit; the code "vu" denotes such relative units in a <dimen>
specification. For example, after you define "\varunit 2pt", a <dimen>
of "7vu" would stand for 14 points. When TEX begins, the values of
\lineskiplimit, \mathsurround, and \varunit are 0pt,
0pt, and 1pt, respectively.
2. There is a new option to \advcount: If you type "\advcount <digit> by
<number>" the specified counter is increased by the specified number. (When
the "by" option is omitted, the counter is increased by plus-or-minus one as
presently.) For example, "\advcount 0 by - \count 1" subtracts counter 1 from
counter 0.
3. The control sequence \unskip can be used in horizontal mode (or restricted
horizontal mode) to delete one glob of glue, if this glue was the last item
added to the horizontal list. The main use of this is to remove an unwanted
space that may have just appeared. For example, in a macro expansion the string
"#1\unskip" denotes parameter #1 with a final blank space (or other glue)
removed, if #1 ends with a blank space (or other glue).
4. Typing "\uppercase{<token list>}" in horizontal mode will change all
lower-case letters of the token list into upper case. (But not the letters of
control sequences.) Similarly, "\lowercase{<token list>}" changes upper-case
letters into lower case.
5. Typing "\xdef<control sequence>{<result text>}" is like
"\gdef<control sequence>{<result text>}" except that definitions in the result
text are expanded. For example, "\xdef\z{\z\y}" will append the current result
text of macro \y to the current result text of macro \z. You can also use \xdef
to expand \counts (as well as \topmarks, etc., in \output routines).
6. The new control sequence \ifpos is analogous to \ifeven; the
\else code is evaluated only if the specified counter is zero or negative.
For example, you can use \ifpos to test if a counter is zero in the
following way:
\def\neg#1{\setcount#1-\count#1}
\def\ifzero#1#2\else#3{\ifpos#1{#3}\else{\neg#1
\ifpos#1{\neg#1 #3}\else{\neg#1 #2}}}
7. A new unit has been added: "em" equals one quad in the current font.
Corrections noted since the November 1978 printing:
Page 14, line 15, change "TEXes" to "TEXs".
Page 22, line 7, change "reading from, if any." to: "reading. (Don't do this
unless there is such a file.)"
Page 56, line 14, change "n≥2" to "n≥1".
Page 83, line 3, change "it is reclassified as Ord." to "Bins are reclassified
as Ords, from left to right."
Page 101, append a new sentence to the second dangerous bend:
However, all other parameters affecting the setting of the boxed paragraph
(the baseline skip, raggedness, etc.) should be set up {\sl before} the
\hbox par.
Page 114, lines -2 and -1, change "\hjsut" to "\hbx" (thrice)
Page 118, line 23, change "final page is" to "page is finally"
Page 127, line 21, change "final page is" to "page is finally"
Page 138 (AMS version), line -4, move "nother example." one space left.
Page 140, line -13, change "Extra ⊗" to "Extra alignment tab".
Page 145, a new error message:
Warning: Long input line has been broken.
Your input file contained a very long sequence of characters between
carriage returns. TEX arbitrarily broke it after 150 characters.
Page 150, lines 4-6 of the code in answer 23.2 should be:
\def\lead{ \leaders\hrule\hfill\ }
\hbox to 4.5in{\ifeven0{\:b\count0\lead\topmark}
\else{\:b\topmark\lead\count0}}}
Page 152, replace lines -8 and -7 by:
\def\spose#1{\hbox to 0pt{#1\hskip0pt minus10000000pt}}
Page 165, replace the various definitions of "\9" by the single
definition "\def\9{\hskip .5em}", putting the latter just before the definition
of \xskip.
Page 166, in the definition of \dimsectionbegin:
Change "\yyskip" to "\sectionskip".
Page 178, the paragraph of text, delete "But watch out: ... Appendix B.)"
Page 181, line 18, change "word," to "word, and".
Page 184, line 5, add "gold-en".
Page 185, line 21, change "ex-press-ible" to "ex-press-*i*ble".
Page 186, line 11, change "com-put-a-*bil-ity" to "com-put-a*bil-ity".
Pages 187-197, "see" and "see also" are in the wrong font in the AMS
version (Xerox software bug!)
Page 190, \Fscr entry should be on a line by itself.
Page 190, \halign entry, change "135" to "136".
Page 191, Knuth entry, change "14" to "15".
Page 194, \Qscr entry is not in alphabetic order.
Page 194, add "Roman numerals, 111."
Page 195, Spacing in math formulas,
tables, 81, 83.
Page 196, last entry in v's has the "vu" entry run into the previous one.
Page 196, entry for \xdef is out of alphabetical order.
Page 197, add: "' (octal number), 34."
Important changes made to TEX on February 25, 1979:
The American Math Society will be printing copies of the TEX manual
with all the above bugs cleaned up, and on this occasion it was the
last chance to change TEX before changes became unwieldy. Thus, Knuth
decided to make a couple improvements, to wit:
1. The control sequences \hjust and \vjust are henceforth changed to \hbox and
\vbox. (This should cause you little or no trouble with MSs already typed,
simply insert "\def\hjust{\hbox}\def\vjust{\vbox}" at the beginning of your
file.)
2. The old kludge about \hjust to ...{ } making a boxed paragraph if the
contents were too large has been replaced by a far better convention.
This change will make TEX balk on some manuscripts it previously handled
(e.g. it might now say "Overfull box, 1138.74 points too wide"), but
only a few changes will really be necessary in your files.
Here are the new rules (replacing the previous rule on page 101):
* You can also get the effect of paragraphing and line-breaking with
\hbox, in the following way: If you give the instruction "\hbox par<dimen>",
TEX will use its paragraph line-breaking routine to convert the horizontal list
into one or more lines of the specified width. In this case the \hbox will
actually result in a box formed from a {\sl vertical} list of horizontal lists
of the desired width. The boxed paragraph that you get is not indented.
For example, the box you are now
reading was made by typing "\hbox
par 156pt{For example, the box
... five lines.}" and TEX broke
it into five lines.
* If you specify hanging indentation with such a boxed paragraph, it applies
to the box and not to the paragraph (if any) containing the box. For
example,
\hbox par 200pt{\hangindent 10 pt <text >}
will put the specified text into a box 200 points wide, where all lines after
the first are indented by 10 points at the left.
New extensions to TEX subsequent to the April printing of the manual.
\chcode has been extended to give you the opportunity to change TEX's math mode
conversion (Appendix F8). Type "\chcode <ascii code plus '200> ← '<type><char>"
where <type> is 0,1,2,3,4,5,6 for Ord,Op,Bin,Rel,Open,Close,Punct,
respectively, and <char> is the three-octal-digit code.
For example, a colon (ascii code '072) is normally treated by TEX as Ord'072,
according to Appendix F8. It turns out this is usually a mistake in computer
science papers, it should rather be Rel'072 (treated as a relation box with
respect to spacing in formulas, see Chapter 18.4). You can get this by
typing "\chcode'272←'3072". (Then formulas like "$x:=x+1$" and "$f:X\to Y$"
will come out properly.)
Three new units of measure are allowed: wd<digit>, ht<digit>, dp<digit>,
denoting the width, height, and depth of a saved box. For example, if you
type "\save5\hbox{k}\hbox to 2 wd5{}" you get an empty box that is twice the
width of the letter k in the current font.
You can use a single letter where TEX expects a <number>; the result is
the ascii code of that letter. For example, the definition of \max in
Appendix B would now more properly be
\def\max{\mathop{\char m \char a \char x}} .
This works only for letters (characters of type 11, see Chapter 7).
The new control sequence \firstmark is allowed in output routines. It
equals the first mark on the page, if any, otherwise it has the
common value of \topmark and \botmark.
The new control sequences \ifvmode, \ifhmode, \ifmmode (analogous to other
\if's) select text based on the current mode.
The new control sequences \hfil, \hfilneg, \hss are short for
\hskip 0pt plus 100000pt, \hskip 0pt plus -100000pt,
\hskip 0pt plus 100000pt minus 100000pt, respectively,
and they take less TEX memory space. The vertical analogs are \vfil, \vfilneg,
and \vss. Examples of use: "\vfil\penalty0\vfilneg" specifies an optional
page break, with a "short" page if the break occurs; "\penalty1000\hfilneg\ "
at the end of a paragraph will force the last line of the paragraph to be
right justified (it cancels the paragraph-fill glue supplied automatically by
TEX).
Control sequences of any length are now remembered in full; the seven-letter
truncation mentioned in Chapter 3 no longer happens.
Changes made subsequent to the Digital Press edition of the manual (Dec 1979)
Page 26, line -8, should be
\hsize 1 in \jpar 1000000 \ragged 1000
Page 27, lines 6 and 7, should be
...trline #1->\hbox to size{\hss #1
\hss }
Page 27, lines 14 and 15 are replaced by a single line
\hbox to size{\hss#1\hss}
Also delete "and followed" from line 19, and change "\hskip etc." on line 21 to
"\hss }".
Page 39, line -9, change "1.667pt" to ".33ex";
on line -7, change "2.5pt" to ".5ex";
and replace lines -6 through -4 by: "(This is for Computer Modern fonts. Other
font designs may require different positioning; you will probably be able to find
somebody who has worked out control sequences that you can use for any necessary
accent on any particular alphabet.)"
Page 40, another new unit
ex One "xheight" of space in the current font
Page 41, add a new sentence after "devices." on line 13:
If you want to avoid this inflation factor, you can say
"true" just before the unit; e.g., "4truein". (No space after "true".)
Page 50, line 7 should say
100000 pt, which is about 115 feet;
and change "1000cm" to "100000pt" on lines 9 and 10.
Page 92, line 12, change "formula is placed flush left" to:
formula is centered between the left margin and the equation number, unless glue
appears at the beginning of the formula; if such glue has been explicitly specified,
it is placed flush left
Page 95, the two-line displays on this page should have had 2pt extra
space between the lines.
Page 99, line 1, "within" should be "with"
Page 99, line 16, delete the sentence "The dimensions you specify should not
be negative."
Page 102, line 4, change to
\def\TEX{\hbox{\:aT\hskip-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}
Page 116, line -3, insert "or \ " before the comma.
Page 120 and 129, add a new entry to the list of internal parameters:
10 dumplength 500 Appendix X
Page 142, lines 12-14, replace "But be careful: ... just now." by:
Remember that blank space after the name.
Page 151, use simpler definitions for \rjustline and \ctrline:
\def\rjustline#1{\hbox to size{\hss #1}}
\def\ctrline#1{\hbox to size{\hss #1\hss}}
Page 152, a new definition of \twoline replaces the old:
\def\twoline#1#2#3{\vbox{\hbox to size{$\quad\dispstyle{#1}$\hfill}
\vskip#2\hbox to size{\hfill$\dispstyle{#3}\quad$}}}
Also we simplify the definitions of \chop and \spose:
\def\chop to#1pt#2{\save0\hbox{$\dispstyle{#2}$}\hbox{\lower#1pt\null
\vbox to 1ht0{\box0\vss}}}
\def\spose#1{\hbox to 0pt{#1\hss}}
Page 163, line 16, put "}" after "<last line>\cr"
Page 170, ...The same codes are used for slanted roman fonts like cms10, and
for text italic fonts like cmti10.
Page 171, line 3, "except for \b, \l, \o, \t, \H, and"
Page 171, line 7, change the "except for" list to include underscore, and exclude
the less-than-or-equal-to and greater-than-or-equal-to signs.
Page 171, the typewriter type code now has an underline in position '032,
suitable for making less-than-or-equal-to and greater-than-or-equal-to signs
from < and >. Position '033 is the German ss as on page 170.
Page 172, delete the sentence "The same codes apply...manual)."
Page 172, codes '134, '136, '137 become undefined.
Pages 184-185, delete these words from the exception dictionary (since it turns
out they aren't hyphenated badly after all): harangue, meringue, tongue,
senseless, morgue, torque, unsearchable.
Page 186, new special exceptions: cat-e-go-ry de-vel-op prob-lem-atic
pro-gram-ming ref-er-enc*e
Page 188r, cmti10, change "172" to "170". Also delete the entry for cmu10.
Page 188r, add pp. 116 and 201 to the Control space entry.
Page 189r, new entry: Dump length, 201.
Page 190l, add pp. 116 and 201 to the Escape space entry.
Page 190l, new entry: \ETC, 201.
Page 190l, delete "Footnotes, 164."
Page 195r, add p. 102 to the "TEX logo" entry.
Page 196l, new entry: true, 41.
Page 196r, the \vfilneg entry, put ")" after "\vfil".
Page 197l, add pp. 116 and 201 to the "\ " (escape space) entry.
Page 201, last line, Chapter 2 should be Chapter 3.
Page 201, new features:
13. You can now use up to 64 different fonts (the 64 codes on page 14 give
64 distinct possibilities).
14. New one-character control sequence feature: If you use \chcode to change
the code of a character to type 13 (see page 32 of the manual... previously
code 13 was illegal), TEX will treat it as if it were immediately preceded by
your escape character. For example, suppose you want to type several
left-justified lines in a row. Here's an "easy" way to do this by redefining
code '15 (which is a carriage-return):
\chcode'15←13 \def
{\par}
the first line
the second line
\chcode'15←5
The effect will be the same as
the first line\par
the second line\par
after which carriage-returns are back to normal again. Similarly, \chcode'40←13
will change spaces into escape-spaces.
Actually there is one important difference between single-character control
sequences and ordinary ones: Blank spaces are not ignored after
single-character control sequences. (TEX is in "state M" after reading them,
cf. pp. 30-31.)
15. \leqno is analogous to \eqno except that the equation number is placed at
the left.
16. If you see "\ETC" at the end of a token list being displayed by TEX
(e.g., an <argument> in an error message), that token list is more than 500
characters long. This number 500 can be changed using \chpar10←<desired value>.
TEX 80: the last extensions to TEX before 1990
Here are some new primitives that seem to enhance the macro-writer's job, as
well as some final cleanups being made to the language before it is frozen
and widely described in PASCAL implementation.
1. \font <fontcode>=<filename> AN INCOMPATIBLE CHANGE!
(Allowed in any mode.) This should precede your first use of that font code.
For example,
\font a=cmr10
now appears in file basic.tex. If this font code has already been defined,
TEX will give an error message unless the file name is the same. (In the SAIL
versions of TEX, no error message will be given if this is a pre-loaded font
code, because the SAIL runtime routines forget all strings at the beginning
of the program and TEX doesn't know the names of the preloaded fonts. Thus you
must still be careful not to redefine the font codes used in Appendix B.)
You should still use \: to select the current font, since \font doesn't do
that.
If you refer to a font code (with \: or \mathrm, etc.) that has not yet been
defined, the error message "! Undefined font code." occurs. To recover, TEX
will expect to see a font file name (possibly preceded by = or ←); so you
can just hit carriage-return after this error message if you want the old
(pre-\font) conventions of TEX.
2. \copy <digit>
(Allowed wherever TEX expects a <box>.) This is just like \box <digit> except
that the value of \box <digit> is not reset to null. For example,
\save1\copy0
makes \box1 a copy of \box0.
3. \unbox <digit>
(Allowed in vertical or horizontal mode but not math or display math mode.)
The contents of \box <digit> are "unglued" and appended to the current vertical
or horizontal list. In horizontal mode, the space factor is set to 1; in
vertical mode, no baseline correction will be made to the following box. The
contents of \box <digit> are reset to null. For example,
\save1\hbox{\unbox1\box0}
appends \box 0 to the previous contents of \box 1 and destroys \box 0.
Note: You can't \unbox an \hbox in vertical mode or a \vbox in horizontal mode.
The potential uses of \unbox to produce multi-column format with balanced
columns are somewhat frightening--they might open Pandora's box.
4. \open <digit>=<filename>
(Allowed in any mode.)
This specifies a file to which your TEX program will be able to send characters
as output. Up to ten such files may be open at once. If the <digit> you specify
was previously used to open a file, that file will be closed immediately, so
be careful. The purpose of \open is to enable nice macro packages to be written
for indexes, tables of contents, cross-references, etc.
5. \send <digit>{<mark text>}
(Allowed in any mode.) As with \mark, all macros in the given text will be
expanded when TEX first sees this \send instruction, but \counts are not
expanded, nor are the names of control sequences following \def or \xdef or
\gdef. The text will eventually be written on the open file corresponding
to <digit> (or on your terminal and on errors.tmp if no such file is open),
at the time of output; at that time, \counts and \topmarks, etc. are expanded.
For example, suppose you say
... Let us define a tree{\send 5{Tree, \count0.}} as ...
in some paragraph. The text "Tree, \count0." is invisibly attached to the word
"tree"; and if \count0 equals 25 when the formatted page containing this word
is output, the string "Tree, 25." will be sent (followed by <carriage-return>
and <line-feed>). If TEX control sequences appear in the text to be output, the
result is the same as you get when lists of tokens are displayed in TEX
error messages.
Here's another example. Suppose you have said
\open 5=refs.tex
and at some later point you say when \count3 = 21
\xdef\cv{\count3}
\send 5 {\def\tarj{\cv}}
\advcount3
The result is to send "\def \tarj {21}" to file refs.tex, and to advance
\count3 to 22. Your input file could say "\input refs" near the beginning; then
the next time to TEX your file, a reference like "[\tarj]" will become "[21]".
The actual sending takes place when the page containing the \send gets output;
in this case \xdef was used to send the value of \count3 before it advanced.
6. \ifdimen <dimen> <relation> <dimen> {<true text>} \else {<false text>}
(Allowed in any mode.) Here <relation> is any of the three symbols <, >, =.
For example,
\ifdimen .5wd3 > 2em{a}\else{b}
yields "a" if half the width of \box3 exceeds two ems in the current font,
otherwise it yields "b".
7. \parval<number> and \codeval<number>
can be used whenever TEX is expecting a <number>; they specify the current
value of a TEX parameter or code (the values that are changed by \chpar and
\chcode).
8. \linebreak in horizontal mode forces a line break but not a page break
(so it's like half of \eject). \pagebreak in horizontal mode forces a page
break after the line that contains it, but not a line break (so it's like the
other half of \eject).
9. \let <control sequence> = <control sequence>
(in any mode) makes an alternate name valid for the present meaning of the
control sequence on the right. For example,
\let\usefont=\:
makes it possible to redefine the control sequence \: (for example if you want
to use : as a one-character control sequence). And
\let\finishpar=\par
\def\par{\finishpar\hangindent 40pt}
sets up hanging indentation after all paragraphs (including those terminated
by double-blank lines).
10. \mskip <dimen> [plus <dimen>] [minus <dimen>]
in math mode gives glue that varies with the current style. The dimensions
must be given in terms of a new unit "mu" that is allowed only with \mskip.
One mu is 1/18 of a \quad in the current style. Thus, for example,
\mskip 5mu plus 5mu
gives the spacing of a "thick space" in display style (cf. p. 81).
11. New parameters for things that used to be frozen into the code:
\chpar11="radsign", the 18-bit code that will be used for \sqrt
(same format as used in \left\char, see p. 79). Default
is '560760.
\chpar12="rfudge", 1000 times the magnification factor used in
computing "true" dimensions. Default is 1301 (XGP),
1100 (Dover), 1000 (at Stanford when we get rid of the XGP).
The output routine might also look at this parameter to scale
the output, although this isn't implemented yet and the desired
scale will probably be indicated by a spooling command in most
cases.
\chpar13="adjpen", penalty for adjacent lines being more than one step
apart in the sequence (shrunk at least 50%, near normal,
stretched at least 50%, stretched at least 100%). As in the
case of double-hyphenation (\chpar3), you give the square of
the desired penalty. Default is 3000.
\chpar14="loose", causes paragraphs to be set this many lines longer
than the optimal number (if you want to avoid widow lines in
straight text), if possible. For example, \chpar14←1 makes
subsequent paragraphs a line longer; \chpar14←-1 makes them a
line shorter (if there's a way). Default is, of course, 0.
\chpar15="jjpar". The new TEX justification routine tries first to
break lines in a paragraph with no hyphenations, using jjpar
instead of jpar to ferret out unfeasible breaks. If this fails,
or if "loose" is nonzero, another attempt is made, trying all
possible hyphenations, and using jpar. Default is 2. (A high
value makes TEX accept badly stretched lines before trying to
hyphenate.)
\chpar16="uchyph". If nonzero, TEX will attempt to hyphenate words
containing upper case letters, using the algorithm of
Appendix H. Default is 0.
\chpar17="exhyph". The penalty for breaking after an explicit hyphen or
dash (see rule e on p54). Default is 50.
\chpar18,19,20, reserved for communication with special extensions
in private versions of TEX.
12. New glue parameters in addition to \baselineskip, etc.:
\specskip <digit>, for any type of glue that you want
to use often. This glue is accessible in any mode by writing
\skip <digit>; it saves internal memory space in TEX.
\spaceskip, if nonzero will be used for spaces instead of the values
from the current font. If you say \spaceskip .3em plus .4em,
the meaning of "em" at the time \spaceskip appears is used (it
won't change when the em changes).
\xspaceskip, like \spaceskip, but this is the glue used for spaces
following periods, question marks, exclamation points (i.e.
space factor 3).
\parfillskip, is the glue automatically inserted at end of each
paragraph. This is the only \...skip parameter that is
initially nonzero; it is initialized to \hfil. (At paragraph
end, TEX removes the last item of the current horizontal list
if it is glue, under the assumption that it was the space that
is scanned before a blank line or before $$ causes the
line-breaking routine to start. Then \penalty1000 and the
current \parfillskip glue are appended.) By giving this
parameter nonzero space and controlling its stretchability and
shrinkability, you can keep the final lines of your paragraphs
from being too empty or too full.
13. \parshape n i1 l1 i2 l2 ... in ln
where n is an integer and each ij or lj is a <dimen>, takes precedence
over hanging indentation (of which it is a major generalization). The
first n lines of each subsequent paragraph will be of the specified
lengths and will have the specified indentations; lines after the nth
will use the specifications for line n. To shut this off, type
\parshape 0. (This feature will not work sensibly in connection with
displayed equations, since TEX considers a displayed equation as if it
breaks the paragraph into separate paragraphs.)
Note: A technical paper discussing all these bells and whistles of line
breaking is being prepared by Knuth and Plass for publication in SOFTWARE
Practice & Experience.
14. \spacefactor n, where n is an integer, can now be used in horizontal mode
to set the value of the space factor to n/100. Previously a user had no way to
override TEX's automatic conventions for this number.
Changes since October 1, 1980 (when a hardcopy version of this ERRATA file
was printed by AMS):
* Page 8, the display at the bottom of the page was lost, it should say \|_|
(note that |_| is the only way I can type that space symbol in this file).
* Page 19, line -4, change "\vskip 1in" to "\topspace 1in". And change
the wording of page 20 so that it says that \topspace gives you space at the
top of a page, \vskip gives space elsewhere (but \vskip is deleted when it
appears at the top of any page). The control sequence \topspace is now
defined in basic.tex; put "\def\topspace{{\hrule height0pt}\vskip}" in
Appendix B, and make an index entry for \topspace.
* Page 178, a new binary relation \heqv (Hardy equivalence symbol) now lives
in position '067 of the symbols fonts.
* Magnified printing and \chpar12:
It is sometimes valuable to be able to control the magnification factor at
which documents are printed. For example, when preparing document masters
that will be scaled down by some factor at a later step in the printing
process, it is helpful to be able to specify that they be printed blown up by
the reciprocal factor. There are several new features in TEX to allow for
greater ease in the production of such magnified intermediate output.
TEX should be thought of as producing as output a "design document": a
specification of what the final result of the printing process should look
like. In the best of worlds, this "design document" would be constructed as
a print file in a general and device independent format. Printing a
magnified copy of this document for later reduction should be viewed as the
task of the printer and its controlling software, and not something that TEX
should worry about. But real world constraints force us to deviate from this
model somewhat.
First, consider the plight of a TEX user who plans to print a document
magnified by a factor of two on a printer that only handles 8.5" by 11"
paper. In order to determine an appropriate \hsize and \vsize, this user
will have to divide the paper dimensions by the planned magnification factor.
Since computers are so good at dividing, TEX offers this user the option of
setting the "magnification" parameter to 2000, warning TEX of the anticipated
factor of 2 blow up, and then specifying \hsize and \vsize in units of
"truein" instead of "in". When inputting a "true" distance, TEX divides by
the scale factor that "magnification" implies, so as to cancel the effect of
the anticipated scaling. Normal units refer to distances in the "design
document", while "true" units refer to distances in the magnified printer
output.
Secondly, some existing print file format and printer combinations have no
current provision for magnified printing. A Press file, for example, uses
absolute distances internally in all positioning commands, and Press printers
treat these distances as concrete instructions without any provision for
scaling. There is a program that takes a Press file and a scale factor as
input and produces as output a new Press file in which all distances have
been appropriately scaled. But it is inconvenient to be forced to use this
scaling program on a regular basis. Instead, the Press output module of TEX
chooses to scale up all distances by the "magnification" factor when writing
the output Press file. Thus, the Press files that TEX writes are not
representations of TEX's abstract "design document", but rather
representations of the result of magnifying it by the factor (\parval12)/1000.
On the other hand, the DVI files written by other versions of TEX containing
normal units of distances, and the software that translates DVI files to
instructions that drive various output devices will do the magnification
by themselves, perhaps even using a magnification that was not specified
in the TEX source program; if the user has not specified "true" dimensions,
his or her DVI output file will represent the design document regardless of
magnification.
Caveat: Due to the manner in which the current implementation of TEX writes
Press files, it is not permissible to change the value of parameter 12 in the
middle of a TEX run. If you want to produce magnified output, you should
reset parameter 12 once very early in your document by using the \chpar12
control sequence, and from then on leave it alone. Another Caveat below
discusses the situation in more detail.
* Magnified fonts, an extension to \font:
The magnification mechanism has been extended to include font specifications
as well: in order to print a document that is photographically magnified, it
is essential to use magnified fonts. A font is specified by the "\font"
control sequence, which now has the syntax
"\font <fontcode>=<filename> at <dimen>".
The "at" clause is optional. If present, the dimension specified is taken
as the desired size of the font, with the assumption that the font should be
photographically expanded or shrunk as necessary to scale it to that size
times the magnification factor specified by parameter 12. For example,
the two fonts requested by the control sequences
"\font a=CMR10 at 5pt" and "\font b=CMR5 at 5pt"
will look somewhat different. Font a will be CMR10 photographically reduced
by a factor of two, while font b will be CMR5 at its normal size (so it should
be easier to read, assuming that it has been designed well).
The dimension in a font specification can use any units, either standard or
"true". The interpretation of "true" here is identical to its interpretation
in the specification of any other distance: asking for a font "at 5pt"
requests that the font be 5 points in size in TEX's "design document", while
asking for a font "at 5truept" requests that the font be 5 points in size
after the scaling implied by the "magnification" factor.
If the "at <dimen>" clause is omitted, TEX defaults the requested size to the
design size of the font, interpreted as a design (non-"true") distance.
Thus, the control sequence "\font a=CMR10" is equivalent to the sequence
"\font a=CMR10 at 10pt", assuming that the designer of cmr10 has indeed
told TEX that cmr10 is a 10-point font.
Caveat: This extension allows the TEX user to request any magnification of
any font. In general, only certain standard magnifications of fonts will be
available at most printers. The user of TEX at any particular site must be
careful to request only those fonts that the printer can handle.
Caveat: As mentioned above, you shouldn't change the value of parameter 12
in the middle of a run. TEX uses the value of parameter 12 in the following
three ways: (i) Whenever the scanner sees a "true" distance, it divides
by the current magnification. (ii) At the end of every page, TEX's output
module may scale all distances by the current magnification while converting
this page to format for an output device. (iii) At the very end of the TEX
run, the output module uses the current magnification to scale the requested
sizes of all fonts. Given this state of affairs, it is best not to change
parameter 12 once any "true" distance has been scanned and once any page
has been output.
* Page 40, there are two new units of distance:
bp "big point" (one inch equals exactly 72 "big points")
mi mica (one millimeter equals 100 micas)
* A new feature to solve the `first footnote on a page' problem at last!
\topsep{<restricted vertical mode stuff>}
and \botsep{<restricted vertical mode stuff>}
will insert their `stuff' between all \topinserts or \botinserts on a page
and the text on that page, unless no insert is present. For example,
suppose a page has two \topinserts and one \botinsert, then you get
\topinsert # 1
\topskip glue
\topinsert # 2
\topskip glue
\topsep
the text of the page
\botsep
\botskip glue
\botinsert # 1.
A \topsep or \botsep specification is global and must appear in
unrestricted vertical mode.
* Page 139, change lines -15 and -16 to read:
! Argument of <control sequence> has an extra }.
Some argument to the specified macro has more }'s than {'s. Proceed, and
* Page 198, line 14, change "[1,3]" to "[TEX,SYS]"
* You can \unskip in restricted vertical mode as well as horizontal mode.
* The hyphenation algorithm has been improved. On page 180, line -11,
change "350" to "310"; later on in that paragraph change "in-form-ant"
and "in-for-ma-tion" to "ex-press-ible" and "ex-pres-sion", respectively.
(Since some dictionaries accept "in-for-mant", it is no longer an exception!)
The suffix removal rules at the bottom on page 180 should now read:
A permissible hyphen is inserted if the word ends with -able or -ably (unless
preceded by c, f,g, p, r, et, it, ot, tt, or ut), -ary (preceded by ion),
-cal, ..., -nary (unless preceded by io), -ogy, ...
Change line 7 of page 181 to read:
"is preceded by three or fewer letters, break -ing only if one of the preceding
letters is a vowel. Otherwise if ing"
Insert -ably between -able and -ary on line 13.
Insert f between c and h on line 20.
Change "l, or m" to "l, m, p, s, or v" on line 24.
The exception dictionary is now extensively changed; the new exceptions will
not be listed here. On page 186 line 8, "been also" should say just "also".
* What was mistakenly called \varomega will henceforth be called \varpi.
This affects page 61 (where \pi will also replace \omega in the example),
page 177, and the index entry on page 196.
* I might include the followng quote from George Bernard Shaw in the next
edition of the user manual, near page 99:
"The only thing that never looks right is a rule.
There is not in existence a page with a rule on it that
cannot be instantly and obviously improved by taking that rule out."
in The Dolphin 4 (1940), p. 81.
* Various TEX constructions use words that are not control sequences, namely
after at by depth expand for height minus par plus size to width
and dimensions like pt, em, etc. Such words will now be recognized if they
use uppercase letters (e.g., \hbox Par SIZE{\hskip 1EM PLUS 3dD}).
* The dimension "cc" (one cicero = 12dd) is now allowed, it's big in Europe.
* Replying with "form feed" to an error message is like "line feed" except more
drastic: Nothing will stop TEX from then on until completion of the run.
(There will be no more "*" or "↑" prompts, and tracing won't pause either.)
* \dpenalty is now allowed in display math mode. It specifies the penalty for
a page break before the glue that follows this display.
* ! Input page ended on different nesting level (n).
This is a new error message, indicating that some page of a file has n more
{'s than }'s (more precisely, that the level of nesting at the end of
the page was n more than it was at the beginning of the entire file).
You probably should insert n forgotten `}' symbols (if n is positive),
or |n| forgotten `{' symbols (if negative), before continuing, so that the
balance is restored.
* \mark is now allowed in horizontal mode
* An optional space can precede { in contexts where { is required, e.g. \if AA {.
* Glue and penalties at the top of a page will be deleted after marks and sends
* ! Incomplete if.
This new error message means that \if is being applied to something other than
two characters (e.g. \if \hsize ...). Proceed, the \if will be ignored.
* \xleaders and \cleaders are new kinds of nonaligned leaders. Suppose the space
to be filled by leaders has length s and the box that fills it has size b. Then
if b goes at most q times into s, you get either q or q-1 appearances of the box
when you use TEX's \leaders. With \xleaders and \cleaders you always get q copies
of the box, but they don't necessarily line up with other leaders on the page.
Let r=s-qb be the remaining space. Then \xleaders (expanding leaders) puts
r/(q+1) of the extra space between each box and at the ends; \cleaders (centered
leaders) puts r/2 of the extra space at each end and butts the boxes tightly
together.
* Incompatible change to typewriter fonts (page 171 of the manual):
The characters in positions '175 and '176 have switched places.
* You can now use most single characters where TEX expects a <number>; the
result is the ascii code of that character. (This extension was permitted
for letters in a previous notice in this errata file. Now it is permitted
also for characters of type "otherchar" as well (see Chapter 7), as long as
the otherchar is not a digit or a ' mark or a + or - sign or a . that might
precede a digit. For example, "\chcode }=2" is now a good thing to say in the
file BASIC.TEX. Other characters can be used too except in cases where the
scanner pre-empts them (namely, escape characters, end-of-line characters,
ignored characters). A new error message is given if no legal number is
present: "! Improper number, 0 inserted." (Previously, 0 was inserted
without warning.)
* To test whether two control sequences are equal, say
\ifx <cs1><cs2>{<true text>}\else{<false text>}
For example, "\ifx\foo\bar{yes}\else{no}" will give "yes" if \foo has been
defined to be the same as \bar, using \def or \let. This means the definition
really is the same, not that it ultimately expands the same.
Examples: Consider the definitions
\def\foo{abc} \gdef\bar{abc} \def\bah{\bar} \xdef\blah{\bar}
\def\empty#1{} \def\empt{} \let\emp=\empt \let\goo=\ifx
and suppose that \und and \new have never been defined. Then
\ifx\foo\bar is true
\ifx\bar\bah is false
\ifx\foo\blah is true
\ifx\und\new is true
\ifx\und\empty is false
\ifx\emp\empt is true
\ifx\emp\empty is false (since the parameters are different)
\ifx\ifx\goo is true
\ifx\emp\def is false
\goo\emp{} gives "! Two control sequences must follow \ifx."
This feature can be used to tell if a control sequence has been defined.
(For example, if definitions are read from a cross-reference file, that
file is empty on the first iteration, so a cross-reference macro needs to
do something different the first time.) It has also proved useful for making
indexes (recognizing when two strings of characters are equal, so they
specify the same index entry).
* New changes to the Computer Modern Fonts have caused the TEX logo to
change a bit. Here is the recommended control sequence (for page 102):
\def\TEX{\hbox{\:aT\hskip-.125em\lower.5ex\hbox{E}\hskip-.075em X}}
* Position '167 in cmsy fonts is now occupied by a diamond operator that
goes with the circle and bullet. It's called \diam.
* When responding `?' to an error, you now get a different help-message:
Type c or C to continue, s or S to scroll all error messages,
etc. So you can get these effects without control codes on various terminals.
The old <cr> (continue) and <lf> (scroll) still work. There's also <ff> or
f or F, which sets up nonstop mode; the latter scrolls errors and doesn't
pause for any reason. On TOPS20, you can get into nonstop mode by typing
a slash at the end of your command line (e.g. "@tex foo/"). Nonstop mode is
intended for overnight batch processing.
* Wizards who try to do weird things with horizontal and vertical lists
need one more feature, which DEK promises is the last feature to be added
before TEX becomes frozen and solid. A new type of box specification is allowed:
If you are in (possibly restricted) horizontal or vertical mode, and if the
last thing in the current horizontal or vertical list is a box,
"\thebox" denotes this box, and removes it from the list. Otherwise \thebox
denotes nothing. For example, if \box1 contains two boxes separated by
glue, you can pick it apart by saying
"\unbox1 \save2\thebox \unskip \save1\thebox".
* Slight change to \halign and \valign: Each column after an \halign
now has the height and depth of the entire row, and each row after a \valign
now has the width of the entire column. This new interpretation (which is
the way alignment always should have worked!) doesn't change anything except
horizontal and vertical rules that extend to the edge of their containing
boxes. As a result, it is MUCH easier to make vertical rules in \haligned
tables. (But one should still use \baselineskip 0pt and \lineskip 0pt and
some form of strut to avoid gaps between the lines.)
* A new type of dimension is now allowable in the "plus" and "minus" parts
of glue specifications, namely "fil", "fill", and "filll". For example,
\hfil and \hfill are respectively equal to \hskip 0pt plus 1fil and
\hskip 0pt plus 1fill; \hss is the same as \hskip 0pt plus 1fil minus 1fil.
In the present TEX, the respective meanings of fil, fill, and filll are
10↑5, 10↑10, and 10↑15 points. However, next year's TEX will treat these
as infinity, infinity↑2, and infinity↑3, and the coefficients of powers
of infinity will be limited in absolute value. Therefore, for compatibility,
present users of TEX should not include large amounts of stretch and shrink
in glue specifications unless they use the new "fil" feature. TEX will
give you a warning message suggestion that you use `fil' if the magnitude
of a stretch or shrink component exceeds 32767pt. For example, if you have
a TEX program that says "\topspace 10pt plus 100000pt", you should change
it to "\topspace 10pt plus 1fil" to avoid the warning message.
See the next page of this file for further details about next year's TEX.
This page describes differences between TEX82, which is the portable
standard definition of TEX in PASCAL, and the TEX systems written in SAIL.
(The SAIL version will NOT be brought up to date to make it compatible with
TEX82; its use should gradually die away as more people take advantage of
the new features available in the PASCAL version.)
NOTE: TEX82 is still being implemented, and the changes are therefore
continuing to accumulate. The list below is being published in TUGboat,
and it is some 600 lines long, so all corrections made subsequent to
February 12, 1982 are being put onto the next page.
* TEX82 does all its calculations that affect line breaking and page
breaking using fixed-point integer arithmetic of limited (i.e., 32-bit)
precision, instead of with floating-point computations, since different
machines differ so widely in the results you get with floating point.
Dimensions are integers in units of 2↑(-16) points, limited in magnitude
to 2↑14 points (which is 18.89 feet). This applies to all dimensions
(e.g., the heights and widths and depths of boxes, the amounts by which
you \raise or \lower a box, \varunits, etc.), except for the dimensions
of stretching and shrinking.
Something different had to be done with respect to the dimensions of stretching
and shrinking, since for example the old TEX defined \hfill to be a stretch
of 10↑10 points, and that number has more than 32 bits to the left of its
binary point. After considering various alternatives, the solution introduced
by the designers of MESA-TEX in 1979 has been adopted for TEX82. Each
stretch or shrink dimension is specified by a fixed point integer that is
either in units of 2↑(-16)pt or 2↑(-16)fil or 2↑(-16)fill or 2↑(-16)filll.
Here pt is, of course, one point; the other units are three orders of
infinity, essentially infinity and infinity↑2 and infinity↑3. To add together
such units of stretching or shrinking, one simply adds the individual
components having the same order of infinity, and then uses the nonzero
component having the highest order.
Thus, when one says "\hskip <a>pt plus <b>fil minus <c>filll", the numbers
<a>, <b>, <c> are rounded to the nearest multiple of 2↑(-16), and their
magnitudes should be less than 2↑(15). The stretch component is
<b> times infinity, and the shrink component is <c> times infinity cubed.
* The shrink component of all glue used in a paragraph should be finite.
Something like "\hskip 20pt minus 2fil" actually makes no sense in a paragraph,
since the paragraph would fit on a single line no matter what. Infinite
shrinkage does make sense in a simple \hbox, of course.
* Identifiers for control sequences in TEX82 are letter strings of any
length, with upper and lower case letters treated as distinct even when
they aren't the first letter. For example, \TEX is not the same as \TeX,
and \GAMMA is not the same as \Gamma. Any character that is regarded as a
letter (this means the 52 letters, initially, plus others that are
\chcoded to 11) can appear in such control sequences. Of course, the
one-character non-letter control sequences still exist as well.
* Font codes (which appear after \font or \: or \mathrm, etc.) are allowed
to be any nonnegative numbers, up to a certain limit (e.g. 200). Thus,
\font A is equivalent to \font '101 and to \font 65, because of the
recently added rule that most characters can be used in place of
constants. In this way, TEX82 is not curtailed by a 64-font restriction.
* Both \looseness and \parshape are now reset to their default values after each
paragraph, as \hangindent always was.
* A somewhat more major change: \hangindent parameters for \hbox par should
now be given outside the box instead of inside. Namely, one should now say
\hangindent 15pt\hbox par 200pt{...}
instead of
\hbox par 200pt{\hangindent 15pt ...}
as the old manual states. In olden times you had to give all other aspects of
\hbox par outside (e.g., the baselineskip, parshape), so the new conventions
are more consistent.
* An even more major change: \chpar has been abolished. In its place, all
of the integer parameters have names instead of numbers. (Thus at last they
become consistent with the dimension parameters \hsize, etc., and with the
glue parameters \baselineskip, etc. My only excuse for bad design in the
first place was that the integer parameters were afterthoughts, stuck in
after TEX was first up and running; it was the easiest way to vary some
of the originally fixed constants. I wanted to finish TEX in a year and
get on to writing Volume 4! That is still my wish.) The main effect of this
change is to delete a few definitions from basic.tex and other macro packages.
Here are the names of the integer parameters:
\tracing (formerly \chpar0=) diagnostic output
\jpar (formerly \chpar1=) badness tolerance after hyphenation
\ipar (formerly \chpar15=) badness tolerance before hyphenation
\hpen (formerly \chpar2=) hyphenation penalty
\penpen (formerly half of \chpar3=) penultimate line hyphenation penalty
\dhpen (formerly half of \chpar3=) double-hyphen penalty
\wpen (formerly \chpar4=) widow line penalty
\bpen (formerly \chpar5=) broken line at page end penalty
\binoppen (formerly \chpar6=) math binary op break penalty
\relpen (formerly \chpar7=) math relation break penalty
\ragged (formerly \chpar8=) raggedness ratio
\disppen (formerly \chpar9=) penalty for breaking before a display
\radsign (formerly \chpar11=) radical sign
\mag (formerly \chpar12=) 1000 x magnification ratio
\adjpen (formerly \chpar13=) adjacent incompatibility penalty
\looseness (formerly \chpar14=) change in paragraph length
\uchyph (formerly \chpar16=) uppercase hyphenation
\exhyph (formerly \chpar17=) explicit hyphenation penalty
\day (new) initialized to current day of month
\month (new) initialized to current month of year
\year (new) initialized to current year
\time (new) initialized to minutes since midnight
\parinspen (new) see below
The former \chpar10 (dump window) is no longer needed, since TEX82 has better
ways to display token lists. The former \chpar18, \chpar19, \chpar20, once
"reserved for extensions", are gone too, since it is now best for a TEX extender
to give names to whatever new parameters are needed. Similarly, \x is gone.
* The new \jpar and \jjpar are devalued by a factor of 100 from the old ones.
In other words, the default is now \jpar 200 and \jjpar 200, so that it is
a true "badness tolerance", i.e., the badness should not exceed 200. Any
value of 8128 or more is equivalent to an infinite value, in which glue
can stretch arbitrarily far.
* Furthermore, \codeval and \parval are eliminated. In their place is a
much more powerful operator called \the. For example, what used to be
"\codeval5" is now "\the\chcode5"; what used to be "\parval2" is now
"\the\hpen". You can even say "\the\:" to get the current font number,
"\the\hsize" to get the current \hsize as a dimension, "\the\baselineskip"
to get the current \baselineskip as a glue value; and you can say things
like "\vbox to \the\baselineskip", which makes a vbox whose height is the
normal amount of baselineskip (exclusive of stretching and shrinking).
If \the occurs in an \xdef or in text or in a send stream message, it
gets expanded (analogous to \count, but there's no use of roman numerals).
Indeed, to suppress conversion of negative \counts to roman numerals you
can now say \the\count.
* \thebox is changed to \lastbox (avoids confusion with \the).
* \minus is like \the, but gives the negative value.
* An array of ten dimension values is introduced, called \dimen0 to \dimen9.
These join \count0 to \count9 and \skip0 to \skip9, so we now have ten of
each basic quantity. Furthermore `3.5dm8' is a dimension equal to 3.5 times
\dimen8.
*Operations on \count, \dimen, and \skip are extended, so that we now have
a complete set:
\setcount <digit> = <number>
\advcount <digit> by <number>
\multcount <digit> by <number>
\divcount <digit> by <number>
\setdimen <digit> = <dimen>
\advdimen <digit> by <dimen>
\multdimen <digit> by <number>
\divdimen <digit> by <number>
\setskip <digit> = <glue>
\advskip <digit> by <glue>
\multskip <digit> by <number>
\divskip <digit> by <number>
Note that \specskip has changed its name to \setskip. The division operations
truncate towards zero.
* In fact, all the things that used to be 0 to 9 are further extended: they
can run from 0 to 255. This applies to \count, \dimen, \skip, \send, and \box.
BASIC.TEX will contain macros for allocating a new \count or \dimen, etc.
* The = sign in \setcount, \setdimen, \setskip, \chcode, \font, \open, \let,
and in other similar things, is now optional. Furthermore an equals sign
is optionally allowed now after \jpar, \hsize, \baselineskip, \setbox
(the new name for \save), etc.
* If you put \global in front of \def or \let or \chcode or \jpar or
\baselineskip or even \: and \parshape and \hangindent, the definition will
now be global. Otherwise the definition is local (except for \gdef and \xdef).
This is a change in the case of dimension parameters: \varunit,
\parindent, \lineskiplimit, \mathsurround, \maxdepth, \topbaseline,
\hsize, \vsize; you should put \global in front of these to get the former
behavior. You probably wanted the former behavior only when changing
\hsize or \vsize in an \output routine.
* \edef is a local \xdef. Both \edef and \xdef can now take arguments
like \def and \gdef.
* Two other modifiers can be placed in front of \def, \gdef, \edef and \xdef:
\long means that the arguments to the macro are allowed to contain
\par tokens; formerly this was always allowed, but now it
is permitted only for "long" macros. Otherwise TEX will now
stop when it sees \par going into an argument, presuming
that a right brace was forgotten. This detects one of the
most frequent errors made by TEX users, before it propagates
to overflow the memory.
\outer means that the macro being defined is not allowed to appear
subsequently either in an argument or in the right-hand side
of a definition or send text, or in the preamble of an
alignment. In other words, the macro should appear only at
"quiet" times. This is another way to catch missing braces
before too much damage is done. It used to be applied at the
end of every page, but most TEX users don't use a page-oriented
editor like E; therefore TEX82 does not treat file pages as
an integral part of its control structure.
* \groupbegin and \groupend provide an alternate way to enter and leave
groups for locally defined values. A \groupbegin will not match a },
nor will { match \groupend; the former gives the message "Missing \groupend
inserted" when the } occurs, and the latter inserts a "missing" }. Note
that you can introduce \groupbegin in one macro and \groupend in another.
* If you say \message{text}, the terminal will display " text" immediately.
For example, the new version of BASIC.TEX contains three message statements
so that when you \input basic your screen will look something like this:
(basic.tex macros fonts layout)
instead of "(basic.tex 1 2 3 4)". (However, one hardly ever needs to
say \input basic any more, as explained below.)
Here's an example macro that displays names of sections when you get to them
in a paper you are TEXing:
\outer\def\section#1{\vfill\eject\message{#1}\ctrline{\bf#1}}
* You can also say \errmessage{text}, which causes a TEX error message like
! text.
* \mathcode<n> replaces \chcode <n+128>.
* The internal character set used by TEX82 is the same regardless of the
external character set. There is no longer a difference like
"\chcode'176" for right brace that applies only at SAIL! Right braces
and underlines and tildes and notequals and a few others have been a
source of problems that have now gone away. Furthermore there is now a
way to input an ascii control character to any version of TEX82 by typing,
e.g., ↑↑A.
TEX82 assumes that all of the standard ascii characters, shown in positions
040 through 176 below, are available; these characters are always converted
to their standard ascii codes. For example, a TEX user who types A is asking
for character 65 of the current font, even though the A might have entered the
computer in EBCDIC or some other code. Non-standard-ascii characters might
also be readable on some implementations of TEX. In such cases they should
have the significance stated below, for best results; and all characters that
cannot be converted to a compatible TEX code should be converted to 177.
ascii TEX description chcode mathcode (when TEX starts)
000 ↑↑@ null ignore bin401
001 ↑↑A downarrow submark rel443
002 ↑↑B alpha other ord213
003 ↑↑C beta other ord214
004 ↑↑D and other bin536
005 ↑↑E not other ord472
006 ↑↑F epsilon other ord217
007 ↑↑G pi other ord231
010 ↑↑H backspace,lambda ignore ord225
011 ↑↑I tab,gamma space ord215
012 ↑↑J linefeed,delta ignore ord216
013 ↑↑K uparrow supmark rel442
014 ↑↑L formfeed,+/- endline bin406
015 ↑↑M carriage-return endline bin410
016 ↑↑N infinity other ord461
017 ↑↑O partial other ord245
020 ↑↑P subset other rel432
021 ↑↑Q superset other rel433
022 ↑↑R intersection other bin534
023 ↑↑S union other bin533
024 ↑↑T for-all other ord470
025 ↑↑U there-exists other ord471
026 ↑↑V circle-times other bin412
027 ↑↑W doublearrow other rel444
030 ↑↑X leftarrow other rel440
031 ↑↑Y rightarrow other rel441
032 ↑↑Z notequal other rel434
033 ↑↑[ escape,diamond action bin567
034 ↑↑\ less-or-equal other rel424
035 ↑↑] greater-or-equal other rel425
036 ↑↑↑ equivalence other rel421
037 ↑↑_ or other bin537
040 space space ord464
041 ! exclamation other close041
042 " double-quote other close042
043 # hashmark param ord561
044 $ dollar-sign math ord577
045 % percent-sign comment ord045
046 & ampersand align ord046
047 ' apostrophe other close047
050 ( left-parenthesis other open050
051 ) right-parenthesis other close051
052 * asterisk other ord052
053 + plus-sign other bin053
054 , comma other punct054
055 - hyphen,minus-sign other bin400
056 . period other ord056
057 / slash other ord057
060 0 zero other ord060
. . .
071 9 nine other ord071
072 : colon other rel072
073 ; semicolon other punct073
074 < less-than-sign other rel074
075 = equal-sign other rel075
076 > greater-than-sign other rel076
077 ? question-mark other close077
100 @ at-sign other ord574
101 A uppercase-A letter ord301
. . .
132 Z uppercase-Z letter ord332
133 [ left-bracket other open133
134 \ backslash control bin404
135 ] right-bracket other close135
136 ↑ caret supmark ord017
137 _ underline submark ord465
140 ` reverse-apostrophe other open140
141 a lowercase-a letter ord341
. . .
172 z lowercase-z letter ord372
173 { left-brace open open546
174 | vertical-line other ord552
175 } right-brace close close547
176 ~ tilde other rel430
177 ↑↑? invalid invalid ord573
As before, the mathcodes (which replace Appendix F8 of the old TEX manual)
are relevant only when the chcode is letter or other. (See below for the
new chcode values.) Two possibilities are given for codes 010, 011,
012, 014, 033, 055; at most one of these should be chosen, and if both are
present on some system keyboards the other should probably be disallowed for
TEX input (mapped into 177). However, since a user can change any chcode and
any math chcode, strict conformity with these interpretations isn't absolutely
necessary. To convert a file into a format that all TEXes can read, one
should change null into ↑↑@, downarrow into ↑↑A, and so on. If a character
set contains uparrow but not caret (e.g., the SAIL system falls into this
category), the uparrow should be considered an ascii caret; code 013 will
be used only if both uparrow and caret are present, as they are at MIT.
Incidentally, this internal coding scheme is based on a scheme used at MIT,
since the MIT code is faithful to ascii while allowing additional visible
characters that are extremely convenient.
An appearance of ↑↑A is equivalent to an appearance of ascii code 001, if
the current chcode of ↑ is supmark. In particular, if somebody in a
foreign country with more than 26 letters in the local alphabet wants to make
\chcode ↑↑A = letter, then control sequences like \a↑↑A↑↑Ab (a four letter
word) are permissible.
TEX82 puts 015 (ascii carriage-return) at the end of each line, except for
the lines that are inserted with "i" after error messages. If the final
character of the line is currently chcoded to be an escape character
(e.g., if you end an error-insertion with \, or if you do \chcode'15=0),
the result is control-null, which is an undefined control sequence unless
you define \↑↑@.
Of course, users are expected to type \ne instead of ↑↑Z if their system's
character set doesn't contain a not-equal sign; TEX82 recognizes ↑↑Z as
ascii 032 primarily to make it possible for straightforward translation of
TEX files from one system so that they will work on another.
Some files contain ascii 014 (form-feed) characters as page marks. Such
characters are ordinarily treated like carriage-returns, since the initial
chcode for 014 is carret. In order to get TEX82 to do the error checking at
the end of a page, as the old TEX did, you can say
\chcode'14=13 \outer\def↑↑L{\par}
* A new chcode value 14 denotes a character that is better for comments
than the present code 5. A character of code 14 denotes end of the current
line (i.e., ignore the remainder of that line), without inserting a blank
space, and without considering that line to be all blank. Thus, if % is
assigned type 14, you can have lines that are completely comments by
starting them with %, without having this line come out as \par; and you
can also end a line with % without having a blank space inserted there.
* Another new chcode value, 15, denotes an invalid character. When such
a character is input, TEX82 issues an error message.
* Here's something that was NOT put into TEX82: It wouldn't be hard to
make TEX understand \escape to mean 0, \opengroup to mean 1, ..., \active
to mean 13, \comment to mean 14, and \invalid to mean 15; then you could
say, e.g., \chcode'14=\active in the example above. But it seems wrong
to make \chcode too easy, since that will only encourage more people to
fiddle with the \chcode table. Let's leave this a black art, to be
resorted to only with reluctance in times of emergency.
* Note that the backslash character is now predefined as an escape character
when TEX82 begins. The old idea about letting the user's first nonblank
character be the escape has been abandoned. Furthermore TEXPRE has been
replaced by a version of TEX called INITEX that allows an entire macro
package to be preloaded; this macro package can define its own chcodes
and mathcodes. The normal version of TEX already has "basic.tex"
preloaded; the normal version of AMSTEX already has the AMSTEX macros
and fonts preloaded.
The new rule for starting TEX is this: If the first nonblank characters
typed are ! or !!, TEX goes into nonstop mode (i.e., no waiting for
terminal input); here !! is "quiet nonstop mode", in which the output
goes entirely to the error-transcript file, not the terminal.
(These nonstop options are intended for overnight batch processing.)
After scanning off the optional !'s, TEX looks at the next nonblank
character. If it is not an escape character, TEX automatically inserts
"\input ". Furthermore, the input may start right on the command line.
Thus, for example, the following ways of starting TEX are equivalent
at SAIL and similar sites:
tex paper
r tex;paper
r tex
* paper
r tex
*\input paper
(The asterisks here are TEX's prompt character. On TOPS-20 what used to
be "@tex paper/", indicating batch mode, is now "@tex !paper".)
* \dump <filename> will save TEX's current memory contents on the specified
file. This is allowed in INITEX only, and only at very quiet times (i.e.,
at group level 0 in vertical mode with nothing on the current page, etc.).
The file name will be printed later when these memory contents are loaded
in a production version of TEX; for example, if you say "\dump BASIC"
on March 1, 1982, the TEX that uses the dumped file might begin with the line
This is TEX, Version 1 (BASIC 82.3.1)
* Actually the program name TEX now stands only for versions of TEX82 that
have BASIC.TEX preloaded. Other preloaded versions (e.g. AMSTEX) will
usually exist too. If your operating system does not allow a program to
start with its memory preloaded, you will have to call a "virgin TEX"
program VIRTEX that first wants to see the name of a format-dump file (e.g.,
BASIC or AMSTEX). In this case a typical calling sequence might be
"@virtex basic !paper". If your operating system is nice enough to allow
preloaded programs, a typical way to create the program TEX would be to
say "@virtex basic" followed by something like "control-C" and "save tex".
* You CAN do certain things now in horizontal mode, e.g., \vfill; TEX82
will silently insert the \par you forgot.
* \discr <number> (analogous to \accent <number>) makes discretionary
characters other than hyphens.
* \close <number> will close a file so that your TEX program can immediately
input it. (Previously you could only do this by, e.g., \open 0=empty0.tmp,
cluttering up the disk with an empty file.)
* \indent takes you from vertical mode to horizontal mode and indents the
paragraph; this can be used if the first item in the paragraph is in an
\hbox or \vbox. You can also use \indent in horizontal mode to stand for
"\hbox to\the\parindent{}". For example, you might say
\hbox par 100pt{\indent This paragraph is indented.}
* \↑↑\ and \↑↑] have gone away, to the delight of people who don't have
nice ways to type ascii control characters. Instead, \- in math mode
precedes a space of any other type, making that space zero in subscript
styles. Thus, the conditional thin space is now "\-\,", and conditional
negative thin space is "\-\!".
* \opspace, \thinspace, \thickspace are now definable like other
glue parameters such as \baselineskip. The units should be in mu. For
example, one of the defaults is \thickspace 5mu plus 5mu.
"\ " in math mode is equivalent to "\,". The old "mathspace"
parameter in symbol fonts (see METAFONT manual p99) is no longer used.
* If you end the parameter part of a definition with an additional #,
the argument-matching process will terminate on the next left brace.
For example, in
\def\chop to #1#{\chopp{#1}}
the call "\chop to 2in{x}" will expand to "\chopp{2in}{x}". The definition
\def\mac#{why}
will subsequently issue an error message if "\mac" is not followed by "{".
* There's a new way to get up to 4096 more math symbols in all three sizes,
by defining font families 0 to 15. For example, suppose that fonts A, D, and F
are Fraktur alphabets in 10pt, 7pt, and 5pt sizes. Then you can define
"\fontfamily 1=ADF", which is something like the code "\mathrm adf" in
basic.tex. Now if you say "\fam1" in math mode, you get characters from
font A, D, or F, depending on the size. For example, "{\fam1 B↓b}" would
give Fraktur B in 10pt with a subscript Fraktur b in 7pt. The rule is
that a family specification overrides the math chcode for symbols of
type letter and otherchar. If you say "\fam1" in horizontal mode, it is
equivalent to "\:A"; i.e., the largest size is used then. Thus if, say,
\bf is defined to be an appropriate family, you can use the notation "{\bf t}"
both in horizontal mode and in math mode. And if \rm is defined to be an
appropriate family, e.g., by saying
\fontfamily 0=adf \def\rm{\fam0}
you can now say, e.g., "\def\max{\mathop{\rm max}}" instead of resorting
to "{\char m \char a \char x}" in order to achieve size-switching. This
extension also makes ligatures and kerning available in math mode.
* The "texinfo" that is given with each font (see Appendix F of the
METAFONT manual) can now be changed by a TEX user program; there was no
way to do this before except by making a new TFM file. Say
\texinfo <font><parameternumber>=<dimen>
For example, \texinfo a3=4pt sets the stretch component of spacing to 4pt
in font a. (Parameter 1, the "slant", is unitless but you should give its
value in units of points.) You can use this feature to adjust math-mode
positioning of subscripts, etc., by changing the parameters in mathsy
and mathex fonts. Note that texinfo is global, it does not get reset
at the end of a group. You can also say \the\texinfo<font><parameternumber>.
* Bit '40 of the \tracing parameter now means that debugging output goes to
the terminal as well as to the error-transcript file; otherwise it goes only to
the error file. Bit '4 now means that statistics about memory usage will
be printed after each page of output, provided that TEX has been compiled
with the statistics-gathering feature. Bit '1 now turns on a warning about
reference to characters that do not exist in a font; such characters will
not be typeset.
* A new dimension parameter \overlimit specifies the tolerance for printing
a diagnostic message about overfull boxes. If the box is overfull by this
amount or less, no message is printed. Default is ".1pt", which was the
old TEX standard. If you say \overlimit 8000pt, you probably won't see any
overfull boxes. If you say \overlimit 0pt, you will see all of them, including
a few that you didn't know about last year.
* Another new dimension parameter \overfullrule specifies the width of a
rule that is added at the right end of overfull hboxes. This rule has the
height and depth of the box. If \overfullrule is zero or negative, or if
the amount of overfullness does not exceed \overlimit, no rule will appear.
Default is 5pt, which gives a big black mark to help you spot overfull boxes.
* The "overfull box" warning messages will be given in a new form that
simply gives the characters in the box; for example,
Overfull box, 3.3326 points too wide (in paragraph of lines 210--216):
\:a This is the text of a line that was over-full for some rea-son.
Discretionary hyphens are shown as real hyphens, so that you can see what
hyphenation TEX was trying. The error-transcript file gets both this message
and an old-style description of the overfull box in detailed diagnostic
dump format.
* Another new control sequence, \relax, does nothing at all. Thus, if you
want to disable the action of a control sequence, you can \let it be \relax.
* Up to 256 fonts may be used, and each font may contain up to 256
characters. (Characters numbered 128 to 255 can be accessed either
via ligatures or charlists or with the \char command.)
* \leftskip and \rightskip specify glue to be placed at the left and right
of each line of a paragraph. This provides better ways to do ragged right
setting, and it makes changes to \hsize less necessary.
* \parinsert{stuff} is a new feature intended for long footnotes. It
acts like \botinsert{\hbox par size{stuff}} except that only the first
line of the paragraph is required to fit on the current page. Line breaks
between lines are allowed (with \parinspen added to the other penalties
corresponding to \wpen and \bpen); and if such a break occurs, the remaining
lines are carried over to the following page where they are treated in
the same way (i.e., the first line must appear, but another break could occur).
* \xsend{text} will send the text to the DVI file instead of to a text file.
Thus, the text will be associated with the current position on a page. It is
undefined what the DVI reading programs might do with such text, but local
sites may want to use this feature for such things as inserting halftone
illustrations, or for specifying lines and curves to be drawn. For example,
"\xsend{Halftone Fig1a}" might be used to include a halftone on file Fig1a
with its reference point at the current page position; and "\xsend{Endpoint 3}"
might be used twice in the file, with the meaning that a straight line should
be drawn between the two endpoints. The text must be at most 255 characters
long.
* \unskip is now legal in vertical mode; if the last item in the current
vertical list is glue, it appends the negative of this glue. (In horizontal
mode, \unskip removes the glue, as before.)
* \sqrt signs in TEX82 are positioned differently in their boxes:
The baseline now comes exactly at the bottom of the place where the vinculum
(i.e., the rule over the operand of \sqrt) is to be joined.
This means that no rounding errors will be possible and perfect alignment
will be obtained at all resolutions. Pre-82 versions of TEX will still work
(subject to rounding) if the height of the box is the thickness of the rule.
* There will be new parameters affecting the size of variable delimiters
that TEX chooses for \left and \right. Details are still being worked out.
A new way of using \char to specify variable delimiters is also going to
be introduced in place of the old 18-bit code; this will probably include
some way to use a character from any font family.
* The error transcript files are no longer called "errors.tmp". Your output
file and transcript file will be "paper.dvi" and "paper.err" if your first
line of TEX input specifies \input paper. The default name "texput" is
used whenever no other appropriate name has occurred before TEX reads
line two of its input. (TEX can't wait any longer, since line one has to
be put into the transcript file, and the transcript file has to have a
name before it gets information.)
* If the \moreout command is activated in an output routine, output will
be activated again. Previously there was no way to get more pages of
output than ejects in the file. For example, here is a way to print text
only on odd-numbered pages and to print only the page number on even-numbered
pages:
\output{\ifeven0{\vbox to \fullpageheight{\vfill\ctrline{\:a\count0}}}
\else{ ... give your normal output routine followed by \moreout ... }
\advcount0}
* \hyphenation{word list} can be used to override TEX's hyphenation algorithm;
for example, to specify hyphenation of the words "hyphenation" and
"exceptions" one can write
\hyphenation{hy-phen-a-tion ex-cep-tions}
A new hyphenation algorithm devised by Frank Liang is used in TEX82; this
one extends much more readily to other languages. Words containing ligatures
can now be hyphenated automatically, even difficult words like "difficult".
* If two fonts are specified with the same name and point size, only one
will be loaded.
* \sfcode <char number> is the spacefactor code for that character, times 1000.
For example, the spacefactor code for period and question mark is normally
3000, for comma 1250, for right parenthesis 0 (meaning do not change the
space factor), and for most characters it is 1000. In TEX82, you also say
"\spacefactor 1234" instead of "\spacefactor 1.234".
* \uccode <char number> is the character code to use when converting to
upper case in the \uppercase function. For example, \uccode a = A.
(Probably nobody will change the default values unless a foreign alphabet
is being used.)
* \lccode <char number> is the character code to use when converting to
lower case in the \lowercase function or when trying to hyphenate a word
that contains upper case letters. For example, \lccode A = a.
* TEX82 has a new "help" facility available on error messages. If you type
"h" after an error, you will (usually) get further explanation of what
the error means, together with suggestions about how to proceed.
This page contains updates to the differences between TeX82 and TeX80.
It was distributed to TUG participants in July, 1982. Any changes since then
are being logged on file CHANGE.TXT[pas,dek].
* Characters by themselves can no longer masquerade as numbers. Thus,
you shouldn't say "\font A" or "\chcode A" any more; this has caused more
mysterious errors than it was worth, and anyway there will be a macro
for defining fonts symbolically in TeX82. Instead, one can use a left quote
in front of a character to get its ascii code; e.g., `A is '101, and `↑↑A is 1.
Furthermore you can use an escape in front of the character, e.g.,
`\A or `\% (these macros will not be expanded), so that we avoid the problem
in TeX82 that you couldn't say "\chcode %" when % had already been chcoded.
* \uccode <char number> is the character code to use when converting to
upper case in the \uppercase function. For example, \uccode`a =`A.
(Probably nobody will change the default values unless a foreign alphabet
is being used.) Characters whose uccode is zero will not be changed
by the \uppercase function.
* \lccode <char number> is the character code to use when converting to
lower case in the \lowercase function or when trying to hyphenate a word
that contains upper case letters. For example, \lccode`A =`a. Characters
whose lccode is zero will not be changed by the \lowercase function.
The lccode is also used for hyphenation; a character whose lccode is zero
will be regarded as a nonletter (e.g., punctuation), and not part of
a hyphenatable word, while a character whose lccode is identical to
the character itself will be considered a lower case letter. For example,
\lccode`a =`a.
* If \uchyph is nonzero, a word whose first letter is upper case will
be subject to hyphenation. (This means a word whose first letter has lccode
nonzero and lccode not equal to the character itself.) Words whose first
letter is lower case will always be subject to hyphenation even if they
contain upper case letters further on.
* The integer parameters are being given more mnemonic names.
\jpar is now called \tolerance
\jjpar (also once called \ipar) is now called \pretolerance
\hpen is now called \hyphenpenalty
\penpen is now called \finalhyphendemerits
\dhpen is now called \doublehyphendemerits
\adjpen is now called \adjdemerits
\wpen is now called \widowpenalty
\bpen is now called \brokenpenalty
\binoppen is now called \binoppenalty
\relpen is now called \relpenalty
\disppen is now called \predisplaypenalty
\exhyph is now called \exhyphenpenalty
\parinspen is now called \interlinepenalty
\dpenalty disappears in favor of \postdisplaypenalty
\displaywidowpenalty is a new thing, it replaces \widowpenalty
just before displays. (In TeX80 this penalty was zero.)
* The \tracing parameter disappears, and its various components each have
their own names. Here are the names currently being planned:
\showboxbreadth (nodes per level when a box is being exhibited)
\showboxdepth (maximum level shown when a box is being exhibited)
\pausing (if nonzero, lines from a file are displayed as they appear)
\tracingonline (if nonzero, diagnostic info goes to terminal as well as to file)
\tracingmacros (if nonzero, shows macros as they are being expanded)
\tracingstats (if nonzero, shows memory usage when TeX has recorded it)
\tracingoutput (if nonzero, shows boxes when they are shipped out)
\tracinglostchars (if nonzero, shows chars dropped because they aren't in font)
\hfuzz (a dimen parameter; hboxes are reported if more overfull than this)
\vfuzz (a dimen parameter; vboxes are reported if more overfull than this)
\hbadness (under/overfull hboxes exceeding this (integer) badness are reported)
\vbadness (under/overfull vboxes exceeding this (integer) badness are reported)
* The previously announced \discr feature is retracted, in favor of the
following more general one:
\discretionary{#1}{#2}{#3}
means the text should either contain #3 without a break, or else it should
contain #1, then a break, and then #2. For example, \- is equivalent to
\discretionary{-}{}{}. The parameters #1, #2, and #3 may not contain anything
but letters and otherchars (not spaces or penalties, etc.);
they need not all be in the same font, and TeX will insert
ligatures and kerns within them if necessary. For example,
the correct way to specify the hyphenation of "difficult" is
"di\discretionary{f-}{fi}{ffi}\-cult". In German, the correct way to
specify hyphenation of "backen" is "ba\discretionary{k-}{k}{ck}en";
presumably if we were doing a lot of these we would define a \ck macro
so that one could type "ba\ck en" or "ba{\ck}en".
* Hexadecimal constants are allowed, using a prefixed ". For example, "DF
= '337 = 223.
* Families have changed a bit since the previous writeup; in essence,
the former set of 4x3 math fonts has been extended to a set of 16x3.
Family 2 specifies the `mathsy' fonts used for symbols; family 3
specifies the `mathex' fonts used for large delimiters; and the other 14 families
can be used in any desired fashion. Instead of `\mathsy f' one now says
\textfont 2=`u \scriptfont 2=`x \scriptscriptfont 2=`z
and these assignments are local (they go away at the end of a containing
group). You must have \textfont2, \scriptfont2, \scriptscriptfont2, and
\textfont3 defined before using math mode, since the parameters of these
fonts contain the values TeX needs for math spacing.
* The \mathcode now has a 15-bit number as its value. The first three
bits specify ord, op, bin, rel, open, close, punct, and var (where var is
like ord but it subsitutes the "current" family for the stated one).
The other twelve bits specify a "math character", with four bits for the
family and eight for the character. For example, character '100 in family 5 is
'2500; of course, this reads a little better in hexadecimal: character "40
in family 5 is "540.
You can say \mathchar followed by such a 15-bit code, to get the equivalent
of typing a character with that math code. Thus, one can now say, e.g.,
\def\cdot{\mathchar '10001 }
instead of \def\cdot{\mathop{\char1}} as formerly. The control sequence \char
is no longer allowed to take values greater than 255.
* When math mode is entered, the current family is set to 1. Thus,
family number 1 is generally for math italic fonts.
* The \radsign parameter goes away. Instead, one says \radical followed
by a delimiter code. Delimiter codes may be used also after the control
sequence `\delimiter' in connection with \left and \right and \comb.
A delimiter code is a somewhat esoteric 24-bit number. The first twelve bits
specify a `small' character, and the last twelve bits specify a `large' one.
When TeX chooses a delimiter, it searches in the following way until
finding the first one large enough: First it looks at the `small' character in
the current size of the family, then (if the current size isn't text size)
it looks at the small character in the next larger size, and so on until
coming to text size. If a suitable delimiter has still not been found,
the same search is carried out starting at the `large' character. If any of
the characters looked at is part of a "charlist", the list is searched
before moving on. If the small or large character is zero, it is ignored;
thus, you can't use character 0 in family 0 as a delimiter.
For example, \sqrt is equivalent to \radical '01600560 in the Computer Modern
fonts; the 0160 specifies \fam0\char'160, and the 0560 specifies \fam1\char'160.
Since '160="70, we can also write this as \radical "070170.
If \delimiter <delimiter code> appears in a formula in some place not controlled
by \left or \right or \comb, it is actually a 27-bit code. The least significant
12 bits are ignored, and the leading 15 bits are used like a \mathchar
(thus, they specify a category as well as a family and character). The
reason is that one can now say, e.g.,
\def\lfloor{\delimiter '401420404 }
so that one can say both \left\lfloor and simply \lfloor.
A \delcode is also given for letters; \left and \right and \comb will use
this code as a delimiter code if they are followed by an "otherchar".
For example, the Computer Modern fonts use \delcode`(='410500400,
assuming that family 2 contains the ordinary roman alphabets.
Initially, \delcode is negative for all characters; this denotes an
invalid delimiter.
All this bit hackery is, of course, unfriendly looking, but the goal is to
make it possible for macro packages to define the friendly codes without
taking up much memory space inside of TeX. All of the TeX control sequences
that used to be predefined for Computer Modern are now unbundled so that
arbitrary encodings can be used. One of the embarrassing limitations of TeX80
was that it could handle delimiters only between '142 and '153 in the
symbols font, and it insisted that these `small' delimiters had corresponding
`large' ones in positions '004--'015 of the mathex font!
* The spacing in math formulas is unbundled too; there are three parameters
\thinmskip, \medmskip, \thickmskip to specify the spacing in formulas
like $x\log x$, $x+x$, and $x=x$, respectively. One defines these using
"mu" units, e.g. `\medmskip = 4mu plus 2mu'. The control sequences `\,' `\>'
and `\;' in math mode yield spaces of these three varieties. (These are
now defined in basic, not TeX primitives. The previous meaning of \> is
now rendered `\nonscript\>'.)
A slightly technical point needs to be made. One can say, for example,
\setskip12 = \the\thinsmskip
\multskip12 by 2
\thickmskip = \skip12
to make \thickmskip equal to twice \thinmskip. For example, if \thinmskip = 3mu,
this makes \thickmskip = 6mu. But if you also want to use \skip12 for horizontal
glue, whether in math mode or not, the amount of skipping will be in points
(e.g., 6pt). The rule is that glue in math mode varies with the size
only when it is an \mskip; when moving between an mskip and a ordinary skip,
the conversion factor 1mu=1pt is always used. The meaning of
`\mskip\skip12' and `\baselineskip=\the\thickmskip' should be clear.
The following example shows a feature that is NOT allowed:
$a \save1\hbox to 18mu{}
\ifdimen 1wd1=10pt{\gdef\x{\over b} \else{\def\x{}}
\x$
Whoever wrote this was trying to be clever and discover whether TeX was
in \textstyle. But the program is self-contradictory, because if the "a" is in
10pt text style the formula changes itself to $a\over b$ where the "a" is in
script style, so the formula changes itself to $a$ where the "a" is in text
style, so... Constructions like this show why TeX does not allow variable
dimensions like mu except in very restricted ways like \mskip.
* New dimension parameters
\scriptspace {this amount is placed at the right of all subscripts
and superscripts; TeX80 used about .45pt always}
\nulldelimiterspace {this amount is used before and after all fractions
defined by \atop, \over, \above, and for all
"." delimiters}
\delimiterlimit {see the next parameter}
* New integer parameter \delimiterfactor. When TeX computes the size of
\left and \right delimiters, it computes delta1=twice the maximum distance
of the enclosed formula from the "axis". (The axis is where the fraction
line would go.) Let delta2=delta1*(delimiterfactor/1000) and
delta3=delta1-delimiterlimit. The delimiters will be as small as possible
provided that their height+depth exceeds both delta2 and delta3. (TeX80
took delimiterfactor=900 and delimiterlimit=1ex; TeX82 lets the user twiddle
with these magic numbers.)
* When unscripted letters occur in math mode, they now are adjusted for
ligatures and kerns. This means, for example, that "df" will be spaced
better, once appropriate kerning information has been added to the math
italic fonts. The (new) rules for spacing are this: If there's no kerning
specified, add the italic correction to every symbol in math mode; otherwise
use the kern (without the italic correction). However, a subscript is
moved left by the amount of italic correction. In formulas like $P↓2↑2$,
the 2's will no longer be directly above each other (the sub-2 will be
to the left of the sup-2 by the amount of the italic correction).
TeX80 put them above each other, thereby following a long-standing convention
(cf. Oxford book by Chaundy et al.), but this usually turned out to be
undesirable, so people started to write $P↑2↓{\!2}$ all the time.
If anybody really wants it the old way, they can get it by ${P}↑2↓2$,
since this puts $P$ in a box (with the italic correction).
* The maximum penalty has been raised from 1000 to 10000; thus, "\penalty 1000"
no longer absolutely prohibits a break, but "\penalty 10000" does.
This number 10000 is being used elsewhere in TeX82 also: For example,
\tolerance or \pretolerance of 10000 is equivalent to saying "use all
possible line breaks, regardless of how much stretching is necessary."
A \penalty of -10000 (or less) is equivalent to the old \eject in vertical
mode, and to the old \linebreak in horizontal mode. These are no longer
primitives of TeX82.
* The \pagebreak feature is also eliminated, in favor of a much more general
feature. You can say \vadjust{vertical list} in the midst of any paragraph,
and whatever is in the specified vertical list will be placed immediately
following the box for its line when the paragraph has been made. For
example, \pagebreak is now written \vadjust{\penalty-10000}. You can use
this feature to do things like insert extra space between lines of a
paragraph (e.g., in \hbox par), something like \noalign does for alignments.
* \ifabsent n tests if \box n is not present. All boxes are initially absent;
a null box (made e.g. by \hbox{}) is empty but present. A box becomes absent
after it is used.
* \topbaseline has changed to \topskip; thus glue is allowed
at the top of a page. This makes it easy to "bottom justify", for example.
(The old \topskip and \botskip are no longer used.)
* Major changes have been made to the \output conventions, so that
it will be easier to produce balanced columns and various other things.
The old ideas of \topinsert, \botinsert, \topsep, \botsep are eliminated!
In their place one says \insert n, where n is a box number, e.g. "\insert 250".
Different numbers correspond to different classes of insertions; for example,
one might want to have figures as well as footnotes inserted at the bottom of
pages, and TeX80 used to use the same treatment for both. Under the new
conventions, all \insert 250's that go on a page will appear in \box 250 when
the \output routine starts.
The old idea of "\page" is gone too, and the meaning of \output has
changed, so read carefully: The contents of an accumulated page, exclusive
of inserts, is placed into \box 255, so that the output routine can place
this material together in whatever way it wants. (\insert 255 is not legal.)
A new TeX primitive called \shipout, followed by a box specification (e.g.,
"\shipout\vbox{\box255\box250}") is what actually produces output. Note
that \ifabsent 250 can be used to test whether any \insert 250's have been
gathered for a page. The \shipout command can be used anywhere, not just
in \output. Incidentally, \shipout prevents the old anomalies about the
values of \counts being different from what people thought they would be
when \sending table-of-contents or index data to a file. The default
\output routine in TeX82, if none is specified, is "\output{\shipout\box255}".
Another new primitive, \vsplit, is handy for multi-column input.
The command "\setbox 2=\vsplit 250 to 100pt" will, for example, make \box2
a box whose height is 100pt, by extracting 100pt worth of material
out of \box250. The depth of \box2 will be at most \splitmaxdepth (using the
rules that TeX used for \page); \vsplit extracts the optimum initial
segment of \box250, in the sense that badness+penalty is minimized and
the segment is as long as possible subject to this condition. After
\vsplit has acted, \box250 will contain the residual, as if a page break
had occurred; thus, glue and penalties will be eliminated following the
break, and the first box or rule (if any) will then be preceded by sufficient
glue to position its top baseline (based on \splittopskip).
The main idea of \vsplit is to make it easier for an \output routine to
produce multiple column format. For example, if \box255 is 300pt high,
one can get triple columns by
\setbox 1=\vsplit 255 to 100pt
\setbox 2=\vsplit 255 to 100pt
\setbox 3=\vsplit 255 to 100pt
(Actually it is safer to use slightly less than 100pt here, but the
exact measurements depend on the top baseline and other things.) The
remaining material in box 255, if any, can be put back onto the following
page, as we will see momentarily; and boxes 1,2,3 can be positioned as
desired before they are shipped out.
The \vsplit routine also looks at \marks in the contained box. It sets
\splitfirstmark and \splitbotmark to the topmost and bottommost contained
marks; otherwise it sets these to null strings.
Of course you can't apply \vsplit to a box that was constructed as an \hbox.
There is no \hsplit (although you could get one via \hbox par).
The old \output routine defined a sequence of items in restricted vertical
mode, with the meaning that this sequence would be vboxed and shipped out.
The new \output routine defines a sequence of items in restricted vertical
mode, with the meaning that this sequence will be placed in front of whatever
TeX has accumulated for the following page, including whatever caused a
break on the current page. Thus, if you write "\output{\unbox\box255}"
you are in serious danger of getting in an infinite loop.
Consider, for example, what happens if a page break occurs at some glue.
If the output routine leaves some of the tail end of the material from
\box 255 in its vertical list, this material will fit perfectly before
the glue that caused the previous break, since the glue following a break
is not eliminated when \box255 was made; glue is simply discarded when it
appears at the top of the new page that is started after \output finishes.
Consider also what happens if a page break occurs at "\penalty-10000". If
you understand what has just been said, you will see that this would cause
repeated looping if the \output routine places something back for the
next page, and this might be a problem. Therefore TeX will change the
penalty to +10000 at a break, and it also sets \outputpenalty to the
value of the penalty that actually caused the break. (\outputpenalty is
set to 10000 if it was glue that caused the break.) Thus, you can
restore the effect of a penalty by putting "\penalty\outputpenalty" at
the end of your output routine.
But how does TeX figure out what to put in box 255 and how much of the
insertions to put into other boxes, before it calls on your output routine?
The rules are slightly complicated, but they have been devised to handle
a wide variety of situations, including situations where some inserts
span several columns. It should be possible to do things like put
footnotes in two columns beneath single-column text, or to put
single-column footnotes beneath double-column text, etc. Here's how:
We associate \skip n, \dimen n, and \count n and \box n with \insert n.
(a) \count n gives a magnification ratio of \insert n with respect to
ordinary text. For example, if two-column footnotes go with one-column
text, and if footnotes are inserted with \insert250, then \count250 should
be 500. If single-column footnotes or page-wide figures are being inserted
with double-column text, the magnification ratio should be 2000. (b) \dimen n
gives a maximum length of inserts for box n; subsequent inserts will be
carried over to a following page. (c) \skip n gives a correction term
when there is at least one insertion for box n.
The total length of inserts is figured as the sum, over all n such that
\insert n appears on a page, of the \skip n plus (\count n over 1000) times
the total natural height plus depth of all \insert n's, including the
original contents of box n before any inserts were made. The badness of
a page is computed from the amount of the text on the page plus the
total length of inserts, and TeX breaks the page so that badness is
minimized. The \vsize is the total of text plus insertions; if you are
using double-column text, your \vsize should be about twice the actual
page height.
If this isn't complicated enough, there is also a rule for splitting inserts,
so that long footnotes can be broken between pages and so that large
figures can be carried over to subsequent pages. Here's the idea: When
we are deciding whether to perform an \insert n or not, we first look to
see if previous \insert n's have all been completed without splitting.
If not, this one is carried over to the next page. If so, this one is
put on the current page, if it does not cause the page to overflow and if
it does not cause the maximum (\dimen n) to be exceeded. In the latter cases,
the insertion is \vsplit to the maximum size that would not cause such
overflow. For example, suppose we get to an insertion at magnification 500
when \vsize minus the current amount of text and the previous total
amount of insertions leaves only 50pt of vertical space left. Suppose the
insertion takes 150pt of vertical space, so that it would take 75pt
after scaling; and suppose that 150pt would not exceed the maximum total
size of insertions for this box. Then we essentially \vsplit the insertion
list to 100pt (this will scale down to 50pt), after which the actual
length of the insertion will be computed as its natural height plus depth
(which might be different from 100pt). The remaining part of the insertion
will be corrected for top baseline, etc., as in an ordinary \vsplit, if
this broken insertion is actually chosen. But TeX will only use broken
insertions if they lead to the minimum badness for the resulting page.
If several \insert n's appear on the same page they are concatenated together
with no baselineskip correction between them. So you should use struts to
produce the correct positioning.
Insertions are treated the same whether they appear in horizontal or
vertical mode. A "floating" insertion turns out to be a special case of
a broken insertion, whose first component is a null box.
TeX doesn't put waiting insertions into \box255, it leaves them on the list
for the subsequent page. If insertions appear in a box that is being vsplit,
they are ignored.
It's too bad that these rules came out so complicated, but in simple cases
the output routines will now be quite simple, and the manual will have
enough examples to make things clear (I hope). Nothing simpler than this
seems to provide the other features that people have been demanding,
and the total amount of programming for the TeX82 page builder is not much
more than there was in TeX80.
* The rules about roman numerals and such are slightly different from what
was advertised before. Here's the new policy: Things like \count and \dimen
and \skip should not appear except in the context of numbers, dimens, and
glue; for example, you shouldn't say "\dimen 5" or even "\count 5" in the
midst of a paragraph. But if you say "\the\count5", the paragraph will
get the (signed decimal) value of the counter; if you say "\the\dimen10"
you will get text like "3.14159pt"; and "\the\skip12" yields text like
"-5.00000pt plus 3.40001fil". And "\number\count5" gives the conventions
of TeX80, i.e., lower case roman numerals if the counter is negative.
In \xdef and \send, TeX82 will expand occurrences of \the and \number,
using the current values, but \count and \dimen and \skip will not be
expanded. This gives you a little more control over what gets expanded.
* In vertical mode, you can say \prevdepth=3pt to make TeX82 act as if the
previous box had a depth of 3pt, when computing the glue between boxes to
achieve the baselineskip. If you set \prevdepth to a value less than or
equal to -1000pt, the baselineskip calculation will not be made. (This is
the case at the beginning of a vbox, or just following an hrule.)
* You can say \the\spacefactor and \the\prevdepth, if you
are in horizontal or vertical mode, respectively.
* New diagnostic features: "\showbox 10" will display the current contents of
\box10 on the terminal. There's also \showthe as in "\showthe\count 5" and
"\showthe\baselineskip". Also "\show\cs" to give a symbolic display of the
current meaning of the control sequence \cs. The present \ddt is deleted,
and \showlists exhibits the current activities the way \ddt used to. If you
are trying to diagnose some mysterious behavior, you can say, for example,
"\showthe\texinfo 15 40" and you will get an error message like "\font 15
has 7 texinfo parameters" (if it has fewer than 40). Incidentally, if your
error message was "\font 4 has 7 texinfo parameters", you would know that
fonts 15 and 4 are being treated identically. (TeX loads only one copy of
a font that you mention twice. If you want to load two distinct copies, so
that you can diddle their parameters independently, you can try something
like "\font 100=cmr10 at 10pt \font 101=cmr10 at 10.00002pt".)
* If you use a \skip parameter in the context of a dimension, the natural
width is used. For example, \setdimen 5=\the\baselineskip. If you
use a \dimen parameter in the context of an integer, the conversion is
in units of sp (scaled points, 2↑{16} of a pt). For example,
\setcount 10= 1truept would set \count 10 equal to 65536000 divided by \mag.
* When you use \advskip, infinite glue wipes out finite glue.
For example, "\setskip 2=5pt plus 2pt minus 1fill
\advskip 2 by 3pt plus 1fil minus 1fil"
is equivalent to "\setskip 2=8pt plus 1fil minus 1fill".
* I said once that \unskip would be allowed in vertical mode, but that
turned out not to be general enough, so I'm retracting that and
substituting a better command: \lastskip gives the value of the previous
item in the current horizontal or vertical list, if that item was glue,
otherwise it yields the value 0pt. The formerly advertised \unskip in
vertical mode should now be written "\penalty100000\vskip\minus\lastskip".
You can also do things like "\ifdimen\lastskip > 5pt{...}\else{...}",
so that one macro can make decisions about spacing based on what has
gone before. (This finally solves the long-standing problem about
spacing after theorems that end with a displayed equation.) Note that
\the\lastskip is permitted, except in \send statements.
* \linepenalty is yet another parameter to control line breaking. TeX82
adds this to the badness before squaring to get demerits. (Previously,
I had \linepenalty=1 always; by setting it a bit higher, like maybe 7 or 8,
you tend to get paragraphs that are set tighter when a line can be saved.
I don't think it's a good idea to make \linepenalty real large, and it
would be foolhardy but weird to make \linepenalty = -1000; this
apparently would minimize the number of lines but maximize the badness!)
* Macro parameters are now delimited by strings instead of single items.
For example, \def\a#1ab{...} followed by \a acaab will set #1 to "aca";
\def\a b#12#{foo#1} followed by \a bbar2baz2{8} will expand to foobar2baz{8};
the latter followed by \a 2... will give an error message (\a not followed
by b). You get the error message only if there's a string before the
first parameter.
* \vtop is now allowed in any mode, just like \vbox.
* \xsend{keyword arg} is a general extension feature. The keywords are
system dependent, but TeX copies "keyword arg" into the DVI file so that
any device driver that knows your keywords will do the right thing with
them. Users should get together if they want to standardize on various
keywords. Examples: \xsend{halftone fig22} could mean "insert a halftone
from file fig22, with its reference point at the current reference point";
\xsend{leftend 2} and a later appearance of \xsend{rightend 2} could mean
"draw a straight line from the left reference point to the right one" (the
"2" is an identifier to distinguish this line from another one);
\xsend{message Foo} could mean "display `Foo' on the console of the printing
device"; and so on. Semantically, \xsend acts like a box of height, width,
and depth zero, as far as TeX is concerned; the argument in braces is sent
to the DVI file where it is associated with the current reference point.
The length of "keyword arg" must be at most 255 characters.
* \ragged is no longer implemented, since \rightskip does ragged right
setting so much better.
* \case <number> {case0}{case1}{case2}\else{remaining cases} illustrates
a new way to choose between more than two alternatives without too many
nested brackets.
* Characters chcoded 13 are not equivalent to one-letter control
sequences. They act like control sequences (e.g., you can use them
after \def and \let), but & and \& will be distinct.
* \everypar{...} inserts its argument into TeX's scanner at the moment
TeX has changed from vertical to horizontal mode. The paragraph indentation
will already appear in the paragraph, unless of course the transition to
horizontal mode was due to \noindent.
* Spanned and omitted columns in alignments: If an entry in an alignment
is `\omit', the preamble text for the column is omitted in this row.
The control sequence \span can be used in place of a tab mark,
and the result is that the surrounding entries are combined together.
You can use \omit only as the first item of a column, and it must be
immediately followed by a tab mark, \span, or \cr; "&\omit\cr" is equivalent
to "\cr", as formerly, but now you are allowed to omit columns other than
the first.
Example: \tabskip 1em plus 1em
\halign to 20em{\ctr{#}&\rt{#}&\lft{#}\cr
AAA&B&C\cr
DDDDDDD\span\omit&EE\cr
\omit\span FFFFF\span\omit\cr
G&\omit H\span III\cr}
where all the letters are 1em wide, say. Let wij be the maximum width of
the entries that span columns i thru j. The first line "AAA&B&C" implies
that w11≥3, w22≥1, w33≥1. The second line says that w12≥7 and w33≥2, and
so on; we find that w11=3, w12=7, w13=5, w22=1, w23=4, w33=2. Column
widths are now assigned from left to right, as follows:
c1=w11
c2=max(w22,w12-t1-c1)
c3=max(w33,w23-t2-c2,w13-t1-c1-t2-c2)
where ti is the natural width of tabskip between columns i and i+1.
In this case t1=t2=1, so c1=3, c2=3, c3=2. This means the natural width of the
lines will be 1+3+1+3+1+2+1=12 ems, so the glue will be stretching to make
up the additional 8ems; each unit of stretch is doubled. When columns are
spanned, however, TeX justifies the material into a box having the appropriate
width for the tabskip glue that was omitted; for example, an entry that spans
columns 1 and 2 will be justified to width c1+t1+sf*s1+c2, where s1 is the
stretchability between columns 1 and 2, and sf=2 in this case since the glue
is being doubly stretched. (If the tabskip glue shirinks, we would of course use
shrinkability instead; in this case spanned columns might actually get smaller
than their natural size.)
The result of the above example, taking account of which parts of the
preamble are omitted by the \omit operations, is therefore
| AAA B C |
| DDDDDDD EE | (columns 1 and 2 spanned and centered)
| FFFFF | (columns 1 to 3 spanned, right justified)
| G HIII | (columns 2 and 3 spanned, left justified)
Restriction: A single entry can span at most 256 columns.
* Spaces are ignored after tab marks in alignments.
* \hbox par is eliminated! Instead of "\hbox par 100pt{...}", one now says
"\vbox{\hsize 100pt ...}" and the effect is almost the same. The only difference
is that the paragraph or paragraphs in the \vbox will have both their hanging
indentation and looseness (and perhaps also their baselineskip) specified
inside the vbox; this is, of course, more logical than the old rule.
Restricted vertical mode is no longer restricted; it's called "internal
vertical mode". It differs from vertical mode only in not going through the
page builder, and in allowing \unskip as well as \vskip with infinite
shrinkability.
* Instead of \parinsert as previously advertised, one writes, e.g.,
"\insert 250{\hsize 200pt ...}", perhaps using the \interlinepenalty
parameter that adds to the penalty between lines of a paragraph (whether
in inserts or not).
* Three new dimension parameters \displaywidth, \displayindent, and
\predisplaysize are assigned values at the beginning of every displayed
formula: (1) displaywidth is the length of the line that will contain the
formula before it is centered; this is usually equal to \hsize, except
when hanging indentation or \parshape are being employed in a paragraph.
(2) \displayindent is the amount by which that line is indented. (3)
\predisplaysize is the amount of copy on the line preceding the displayed
formula; this is what is used to decide between \dispskip or \dispaskip.
If the display immediately follows \noindent or another display,
\predisplaysize will be -(2↑{30}-1) sp (the smallest legal dimension in
TeX). Otherwise, if the position of the last box on the previous line is
affected by glue stretching or shrinking, \predisplaysize is set to
+(2↑{30}-1) sp. Otherwise \predisplaysize is set to the natural width that
the preceding line would have if all glue were removed at its right end,
plus the amount of indentation of that line, plus 2ems.
* \setcount, \setdimen, \setskip, \setbox, \output, and \everypar are local
definitions unless specified global. Likewise the results of \advcount, etc.
* Major change about grouping: The { } in \if and \else and \case clauses
no longer defines grouping for locality. If you want the old convention,
use {{ and }}. The { } in \output still defines grouping (it would be
too dangerous to leave it out, since \output occurs asynchronously),
but the { } in \everypar does not.
* All of TeX's primitives now mean the same thing in all modes. The control
sequences that were exceptions to this rule have been dealt with as
follows:
\ (control space) now means a text space, even in math mode.
\quad is no longer a primitive (the new basic defines it as \hskip 1em).
\! is no longer a primitive (the new basic defines it for math mode only
as \ifmmode{\mskip -3mu}\else{\errmessage{Use \! in math mode only}}
and \ignorespace is a new primitive that gobbles spaces.
\- is always a discretionary hyphen; its previously advertised mathmode function
has been taken over by the new \nonscript primitive.
* \accent is allowed only in horizontal mode; \mathaccent only in math mode.
The latter takes a 15-bit math code, the former an 8-bit character code;
it's like the difference between \char and \mathchar.
The \mathaccent primitive will make use of a charlist of characters to
choose the first accent of a list whose successor is either nonexistent
or wider than the formula being accented. Thus, you can have a list
of longer and longer tildes or hats, etc.
* Spacing in math is slightly different: Boxes and {...} and \left...\right
subformulas are given type Inner, so there are eight types instead of seven.
(Previously Inner was treated like Ord.) The spacing matrix entries are
set so that x followed by Inner is the same as x followed by Open;
Inner followed by x is the same as Close followed by x.
This removes the anomaly that "\left(" didn't act like "\mathopen(".
(The new fonts have more space outside of parentheses, especially outside
of the large parentheses.)
* "\vcenter to 100pt" is now allowed in math mode, if anybody wants it.
* "\comb" is changed to "\xatopx". There's also "\xoverx" and "xabovex".
For example, {1\xoverx[]2} is sort of like \left[1\over2\right].
* "\ifdimen" is renamed "\ifdim" and there's also "\ifnum" replacing "\ifpos".
Examples: \ifnum\count1>5{...}\else{...}; \ifdim\dimen3<1.5wd2{...}\else{...}.
* "\ifinner" is true if the current mode is internal-vertical,
restricted-horizontal, or non-display-math. Combining this with \ifvmode,
\ifhmode, \ifmmode makes it possible to determine exactly what mode
you are in.
* The \dump feature of INITEX is slightly modified: \dump is now essentially
like \end (it's the last thing you do with INITEX), and you don't specify
a file name. If your input was named foo, your output file will be named
foo.fmt. Such files are now called format files (I used to call them memory
files).
If you start TeX by, e.g., "virtex paper", and if paper.fmt cannot be found
either on your own directory area or on the system area, then basic.fmt
will be loaded and the next thing will be "\input paper".
* The business about starting TeX with ! or !! is scrapped. There are four
new primitives \batchmode, \nonstopmode, \scrollmode, \errorstopmode
that represent increasing amounts of interaction. \batchmode and \nonstopmode
will never stop for any reason; \batchmode omits printing anything on the
terminal (but the .err file gets everything, as usual). \scrollmode doesn't
stop for error messages, but it does stop if files can't be found, or if
\pause is nonzero. \errorstopmode is the default. If you aren't in
\errorstopmode, your .err file will contain "help" messages for all of
your errors. These modes are global (they don't revert at end of group).
They can be set in a format file; thus you can have a format that implies
batch processing. But you could override that, e.g. by running
"batchtex \errorstopmode \input paper". (This example assumes that
batchtex is a program representing "virtex batch", i.e., a virgin TeX with
batch.fmt loaded and then the core image saved.)
* New primitive \kern allows you to specify unbreakable space (without
stretching or shrinking). Thus, "\kern -1pt" is something like
"\penalty10000\hskip-1pt". There's also "\mkern 3mu" in math mode.
You are allowed to use \kern but not \hskip in \discretionary lists.
A \kern in a word does not upset the hyphenation algorithm.
You can use \kern in vertical as well as horizontal lists.
It is legal to break at a kern if it is immediately followed by
glue or leaders, provided that it is not preceded by glue, kern,
or penalty.
* \send, \open, and \close will be ignored if they occur within a
\leaders construction. (Reason: The number of times a leader box occurs
might be 0 or 1 depending on floating-point rounding. This restriction
keeps the language independent of floating point.)
* New debugging facility \tracingcommands, if nonzero, gives a symbolic
indication of what commands are being obeyed by TeX's main control routine.
IMPORTANT NOTE ABOUT A CHANGE TO BASIC.TEX
Since most of the rest of the world doesn't have the SAIL character set,
they can't use the special codes we do. Therefore the new TEX manual
will not be able to use circle-times (⊗) as the tab mark, and instead
the ampersand character (&) will be adopted for that purpose. (This
convention is already in wide use outside of Stanford.)
Furthermore, the normal character for subscripting will be underline (_),
although the manual will continue to show it as ↓.
With these two changes, TEX will be able to live entirely in the ascii
world. What does this mean to us at Stanford? Only one thing that is
incompatible with what we have been doing:
We shouldn't use the character & by itself to stand for an
ampersand in the current font.
Instead, the control sequence \& should be used.
For example, if you now have a file that refers to
Software---Practice & Experience
you should change that to
Software---Practice \&\ Experience
(noting that a \ should come both before and after the ampersand).
The file BASIC.TEX has been changed so that \& will give you the
ampersand sign, as \% gives you the percent sign. Please change
your files now to use this feature, because it won't be long before
BASIC.TEX changes again to DISALLOW the old use of &. If you try
& after the NEXT change, you'll get an error message "! There's no
\halign or \valign going on."